Haskell嵌套在where子句中

时间:2015-03-16 02:11:51

标签: haskell syntax-error

我是haskell的初学编码员,同时从这本惊人的书的第一章开始练习:http://book.realworldhaskell.org/read/getting-started.html 我遇到了这个问题:

-- test comment
main = interact wordCount
 where
     wordCount input = show (ls ++ " " ++ ws ++ " " ++ cs  ++ "\n")
     where
         ls = lines input
         ws = length words input
         cs = length input



wonderbox:ch01 manasapte$ runghc WC < quux.txt
WC.hs:5:9: parse error on input ‘where’

为什么我不能窝里?

3 个答案:

答案 0 :(得分:10)

由于您的第二个where附加到wordCount定义,因此需要缩进比它更多。 (虽然之后你还会有其他一些错误。)

答案 1 :(得分:5)

其他人已经回答了。我只想补充一些解释。

简化一点,Haskell缩进规则是:

  • 有些关键字会引发一系列事件(whereletdocase ... of)。
  • 找到这些关键字后的第一个单词,并注意其缩进。将列命名为pivot列。
  • 在枢轴上准确开始一行,以在块中定义新条目。
  • 在数据透视后开始一行,以继续前一行开始的输入。
  • 在枢轴之前开始一条线以结束该区块。

因此,

where
     wordCount input = show (ls ++ " " ++ ws ++ " " ++ cs  ++ "\n")
     where
         ls = lines input
         ws = length words input
         cs = length input

实际意味着

where {
     wordCount input = show (ls ++ " " ++ ws ++ " " ++ cs  ++ "\n")
     ;
     where {     -- same column, new entry
         ls = lines input
         ;   -- same column, new entry
         ws = length words input
         ;   -- same column, new entry
         cs = length input
         }
     }

将第二个where视为与wordCount无关的单独定义。如果我们更多地缩进它:

where {
     wordCount input = show (ls ++ " " ++ ws ++ " " ++ cs  ++ "\n")
       where {     -- after the pivot, same entry
         ls = lines input
         ;
         ws = length words input
         ;
         cs = length input
         }
     }

答案 2 :(得分:2)

缩进不正确,这是工作版本:

-- test comment
import Data.List
main = interact wordCount
    where wordCount input = unlines $ [concat $ intersperse " " (map show [ls, ws, cs])]
            where ls = length $ lines input
                  ws = length $ words input
                  cs = length input