2010-06-04 94 views
1

我有一個haskell問題。 putStrLn應該是一個[Char]或者一個String,儘管看起來我把它給了編譯器,他仍然抱怨。putStrLn,類型Char不匹配[Char]

*** 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的參數。那麼問題是什麼? :/

+1

只有幾點格式化建議:你的代碼格式不正確,不能在GHC中運行。嘗試使用上面的行來排列每一行(所以'putStrLn line'的'p'就在'line < - getS x'的'l'的下面。另外,如果你有''''''''抱怨line'並且放棄了'<',所以這是一個法律意見,人們可以複製粘貼你的代碼。 – 2010-06-04 09:01:49

+1

是的,你說的是事實:D我會更好下一次 – pullitnah 2010-06-04 09:06:11

+0

這次爲什麼不更好?你總是可以回過頭去編輯你的問題!(另外,+ +1爲我帶着幽默感帶着你的挑逗感:)與你的Haskelling祝你好運!) – 2010-06-04 11:01:24

回答

11

由於您的getS返回的是String而不是IO String,因此不需要用「提取」純值與<-

只需使用

do 
    let line = getS x 
    putStrLn line 
    getV xs 

此外,還有一個mapM function您可以

getV xs = mapM (putStrLn.getS) xs 

和你getS不必要地使用單子。

getS [] = "" 
getS ((c,_):str) = "(L" ++ [c] ++ ")" ++ getS str 

當然,可以使用內置函數來編寫它。

getS ps = concatMap (\(c,_) -> "(L" ++ [c] ++ ")") ps 

你的代碼不會對line <- getS x線失敗的原因,並line成爲Char是因爲目錄也是一個單子。例如,我們可以將笛卡爾積寫爲

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. 

實際上,列表理解是基於列表的這個monadic屬性。

cartesian xs ys = [(x, y) | x <- xs, y <- ys] 
+0

這是一個包裝! TY – pullitnah 2010-06-04 08:59:26

相關問題