[英]putStrLn, type Char does not match [Char]
我有一个haskell问题。 putStrLn应该采用[Char]或String格式,即使似乎我将其交给Compiler先生,他仍然抱怨。
*** Expression : putStrLn line
*** Term : line
*** Type : Char
*** Does not match : [Char]
它引用的代码是这样的:
getV::[[(Char,Float)]] -> IO ()
getV [] = putStrLn ""
getV (x:xs) = do line <- getS x
putStrLn line <-- Complaining line
getV xs
getS::[(Char,Float)] -> String
getS [] = ""
getS ((c,f):str) = do a <- "(L" ++ [c] ++")" ++ getS str
return a
我确实删除了一点,但是应该是完全相同的行为。 getS返回一个字符串,该字符串是putStrLn的参数。 那是什么问题呢? :/
由于您的getS
返回的是String
而不是IO String
,因此无需使用<-
来“提取”纯值。
只需使用
do
let line = getS x
putStrLn line
getV xs
此外,还有一个mapM
函数 ,您可以
getV xs = mapM (putStrLn.getS) xs
并且您的getS
不必要地使用了monad。
getS [] = ""
getS ((c,_):str) = "(L" ++ [c] ++ ")" ++ getS str
当然,可以仅使用内置函数来编写它。
getS ps = concatMap (\(c,_) -> "(L" ++ [c] ++ ")") ps
您的代码不会在line <- getS x
行上失败并且该line
成为Char
的原因是因为List也是monad。 例如,我们可以将笛卡尔乘积写为
cartesian :: [a] -> [b] -> [(a,b)]
cartesian xs ys = do
x <- xs -- # Now x is of type 'a', representing any element in xs
y <- ys -- # Now y is of type 'b', representing any element in ys
return (x, y) -- # Return the tuple composed of any elements in xs and ys.
实际上,列表理解是基于列表的这种单子属性。
cartesian xs ys = [(x, y) | x <- xs, y <- ys]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.