在我开始的函数式编程类中,我正在尝试编写一个程序来返回给定列表的中间三分之一。据我所知,最简单的方法是采用列表的前三分之二,然后丢弃不需要的前三分之一,只返回中间三分之一。但是,我似乎无法正确使用语法。
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
答案 0 :(得分:2)
Haskell使用带有重要空白的“布局”样式语法,就像Python一样。在这种情况下,由于middlethird
和where
同样缩进,解析器认为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
真的明确表示。测试解释器中的每一步,以便您知道它是否符合您的想法。如果你只是停止恐慌并停止让自己陷入括号之海,我绝对相信你可以自己解决这个问题!