2016-03-03 54 views
1

我试图读取在第一线n,则n输入的线,并打印从每一行的第2个元件,诸如的总和:Haskell中:转换字符串 - > [列表]

输入:

2 
1 2 
3 4 

输出:

3 
7 

到目前为止我的代码看起来像:

import Control.Monad 

fromDigits = foldl addDigit 0 
where addDigit num d = 10*num + d 

first (x:xs) = fromDigits x 
second (x:xs) = fromDigits xs 

main = interact processInput 
processInput input = unlines [perLine line | line <- lines input] 

perLine line = first line + second line 

,但我得到以下错误

无法匹配型“[字符]”与“炭”

无法匹配类型“字符”与“[字符串]”

我是Haskell的新手,所以我不确定如何解决它。

+4

尝试写出来的类型,它会在调试有很大的帮助! – jamshidh

+0

一些提示:'type String = [Char]'。你将如何阅读“12 3”这样的一行来得到答案'15'?必须有一些东西与空间做些什么。你如何将像'7'这样的字符转换成可以像'7'一样添加的数字? – Cirdec

+1

“互动”一次只处理一行,并且永不停止。您应该读取第一行,然后精确地读取第一行指定的行数 - 例如,使用readLn >> = flip replicateM getLine'。'processInput'的类型必须是'[String] - > [String]',但'interact ::(String - > String) - > IO()' - 还有其他类型的错误,但这可能是你特别提到的一个。 – user2407038

回答

2

一些提示,依次是:

  • 在某些时候,你需要将数字转换从CharInt等。
    • ,除非你问哈斯克尔不会为你做的。使用ord
  • x:xs模式中,xs是列表的其余部分,而不是下一个元素。
    • 这可能是您的[Char]Char问题来自哪里的问题。
  • 它看起来像你要正确对待每一行字的序列。
    • 尝试使用words功能。
  • 最后,您需要将您的数字转换成可打印的形式输出。
    • 哈斯克尔不会为你做的,无论是。使用show

在一般情况下,我建议启动ghci和摆弄它,只是为了获得与Haskell的一些基本的了解。拉起Hoogle或在另一个窗口中其他一些Haskell的参考...

相关问题