【问题标题】:Haskell : Transform String -> [List]Haskell:转换字符串-> [列表]
【发布时间】:2016-03-03 16:52:41
【问题描述】:

我试图在第一行读取 n 然后 n 行输入并打印每行前 2 个元素的总和,例如:

输入:

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
   

但我收到以下错误

无法将类型“[Char]”与“Char”匹配

无法将“Char”类型与“[String]”匹配

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

【问题讨论】:

  • 尝试写出类型,对调试很有帮助!
  • 一些提示:type String = [Char]。你将如何阅读像12 3 这样的行来得到答案15?一定有一些东西可以用空格做一些事情。如何将'7' 之类的字符转换为7 之类可以添加的数字?
  • interact 一次只处理一行,从不停止。您应该阅读第一行,然后是第一行指定的行数——例如,readLn &gt;&gt;= flip replicateM getLineprocessInput 的类型必须是 [String] -&gt; [String]interact :: (String -&gt; String) -&gt; IO () - 还有其他类型错误,但这可能是您特别提到的那个的来源。
  • fromDigits xfromDigits xs 其中之一肯定是错误的。 xCharxs[Char] 所以类型不匹配。

标签: haskell functional-programming


【解决方案1】:

一些提示,按顺序:

  • 在某些时候,您需要将您的数字从Char 转换为Int 等。
    • 除非您提出要求,否则 Haskell 不会为您这样做。使用ord
  • x:xs 模式中,xs 是列表的其余部分,而不是下一个元素。
    • 这很可能是您的[Char]Char 问题的来源。
  • 您似乎希望将每一行视为一个单词序列。
    • 尝试使用words 函数。
  • 最后,您需要将您的数字转换为可打印的形式以便输出。
    • Haskell 也不会为您这样做。使用show

一般来说,我建议启动 ghci 并使用它,只是为了对 Haskell 有一些基本的了解。在另一个窗口中拉起 Hoogle 或其他一些 Haskell 引用...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 2017-04-04
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多