在let语句中使用where子句时出错

时间:2016-02-22 03:22:47

标签: haskell

这是我的代码:

main = do
   contents <- getContents 
   let threes = groupsOf 3 (map read $ lines contents)
      where groupsOf 0 _ = []
            groupsOf _ [] = []
            groupsOf n xs = take n xs : groupsOf n (drop n xs)
    putStrLn $ show threes

当我将文本文件输入输入时运行此操作时,我得到:

test.hs:4:13: parse error on input `groupsOf'

不确定我在这里做错了什么。据我所知,我的语法是正确的......

1 个答案:

答案 0 :(得分:2)

您提出了很多语法问题。

contents = <- getContents

这是无效的,应该是contents <- getContents

let threes = groupsOf 3 (map read $ lines contents)
   where groupsOf 0 _ = []

在没有进一步缩进的情况下,您不能在let子句之后拥有where。你可以将where子句移动到函数之后,在一个let子句中声明groupsOf,或者将where稍微缩进let子句中变量的缩进:< / p>

let threes = groupsOf 3 (map read $ lines contents)
    groupsOf 0 _ = []
    groupsOf _ [] = []
    groupsOf n xs = take n xs : groupsOf n (drop n xs)

编辑:在参考Haskell 2010报告后,我不认为let { decls } where {decls}实际上是有效的Haskell。 GHC解析表达式,我认为这些表达式在某些情况下是合法且好的,尽管这里的风格很糟糕。