簡體   English   中英

putStrLn,類型Char不匹配[Char]

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM