Haskell - Failed to match type '[Char]' with `Char '

I currently have the following code in Haskell

splitStringOnDelimeter :: String -> Char -> [String]

splitStringOnDelimeter "" delimeter = return [""]

splitStringOnDelimeter string delimeter = do
    let split = splitStringOnDelimeter (tail string) delimeter
    if head string == delimeter
    then return ([""] ++ split)
    else return ( [( [(head string)] ++ (head split) )] ++ (tail split))

If I run it on a Haskell terminal (i.e. https://www.tryhaskell.org ) with values ​​for a return statement such as ( [( [(head "ZZZZ")] ++ (head ["first", "second", "third"]) )] ++ (tail ["first", "second", "third"]))or [""] ++ ["first", "second", "third"]or [""], then I get the correct types from the terminal, which is different from my local stack compiler. Also, if I also changed the top return statement to return "", then it does not complain about this statement, which I am sure is wrong.

My local compiler works fine with the rest of my Haskell code base, so I think it might be something wrong with my code ...

+4
source share
2 answers

Monad typeclass , return. return - , Haskell return , .

, return:

splitStringOnDelimeter :: String -> Char -> [String]
splitStringOnDelimeter "" delimeter = [""]
splitStringOnDelimeter string delimeter =
    let split = splitStringOnDelimeter (tail string) delimeter in
    if head string == delimeter
    then ([""] ++ split)
    else ( [( [(head string)] ++ (head split) )] ++ (tail split))

return :: Monad m => a -> m a ( a) . , Haskell , . , return [""] , return [""] ( ), [[""]], , , [String].

do, , .

, return , () , , , .

, , head, tail .. -: . :

splitStringOnDelimeter :: String -> Char -> [String]
splitStringOnDelimeter "" delimeter = [""]
splitStringOnDelimeter (h:t) delimeter | h == delimeter = "" : split
                                       | otherwise = (h : sh) : st
    where split@(sh:st) = splitStringOnDelimeter t delimeter

, , string h t, . , . if - then - else -, , . , where , splitStringOnDelimter t delimeter, split ( (sh:st)). , , , . , sh st head tail.

, :

Prelude> splitStringOnDelimeter "foo!bar!!qux" '!'
["foo","bar","","qux"]

, , return do, , (do - ). .

+12

return forall m a. Monad m => a -> m a. splitStringOnDelimiter [String], , - return, , m a, m [] ( Monad), a - String. , String return. , , return ([""] ++ split), return, [""] ++ split [String], String.

do , , . , .

2 . foldr, . , foldr, ; , .

, , . , , split, , NonEmpty String, head tail ( Data.List.NonEmpty), .

import Data.List.NonEmpty as NE (NonEmpty(..), (<|), head, tail)

splitStringOnDelimeter :: String -> Char -> NonEmpty String
splitStringOnDelimeter string delimiter = foldr f (pure "") string
  where f h split = if h == delimiter 
                      then ("" <| split) 
                      else (h : NE.head split) :| NE.tail split
0

Source: https://habr.com/ru/post/1695652/


All Articles