以Haskell列表为中间;我哪里错了?

时间:2013-09-26 02:22:55

标签: haskell

在我开始的函数式编程类中,我正在尝试编写一个程序来返回给定列表的中间三分之一。据我所知,最简单的方法是采用列表的前三分之二,然后丢弃不需要的前三分之一,只返回中间三分之一。但是,我似乎无法正确使用语法。

middlethird :: [a] -> [a]
middlethird l
    |len `mod` 3 /= 0 = []
    |otherwise        = drop (1 `div`take ((2 `div` 3) len) l drop ((1 `div` 3)*len) l
    where len = length l

现在我在'where'上得到一个解析错误,我不明白......但在此之前我只是为我输入的每个列表得到一个空集,当它应该只返回一个空当列表的长度不能被3整除时列出。

我很困惑......任何帮助或指示都会非常感激。正如我所提到的,这是家庭作业的一部分,但这是最后一部分,其他一切似乎都运行良好。对不起我的经验不足!

编辑:没关系,我明白了。

middlethird :: [a] -> [a]
middlethird l
    |mod len 3 /= 0 = []
    |otherwise =  drop (div len 3) (take (2*(div len 3)) l)
    where len = length l

2 个答案:

答案 0 :(得分:2)

Haskell使用带有重要空白的“布局”样式语法,就像Python一样。在这种情况下,由于middlethirdwhere同样缩进,解析器认为where应该是一个新的函数定义,因为您可以重新定义关键字,所以它会受到打扰。

此外,您的otherwise分支中有太多开放的parens。

答案 1 :(得分:2)

您认为代码应该如何工作并不清楚。看起来你试图按列表划分数字,并将号码作为函数来调用,这两者都是100%非法且你知道 - 你只是没有意识到你的代码中会发生什么。你能用更多的变量逐步写出你想要做的事情吗?像这样可能:

last_two_thirds_start_at = (2 * len) `div` 3
list_of_first_two_thirds = take ... l
...
list_with_middle_third = drop ... list_of_last_two_thirds

真的明确表示。测试解释器中的每一步,以便您知道它是否符合您的想法。如果你只是停止恐慌并停止让自己陷入括号之海,我绝对相信你可以自己解决这个问题!