【发布时间】:2017-07-26 18:15:42
【问题描述】:
我是 Haskell 的新手,我正在尝试编写简单的函数来让自己习惯语法,我想编写自己的函数来将某个元素添加到特定索引处的列表中。这是我在 Atom(我的文本编辑器)中写的:
addElem :: a->[a]->Int->[a]
addElem elem list index
| index <= 0 = elem:list
| index < (length list) = a ++ (elem:b) where a = take index list; b = drop index list
| otherwise = list
这个想法是只要索引是Int 并且elem 与list 的元素类型相同,它就不会出错,但是当我尝试将其加载到 ghci 中时,我得到了“在 `|' 上解析错误。”我需要限制参数的类型吗?我正在阅读 Learn You A Haskell,但我还没有完全解释缩进如何工作的部分,所以我的错误也可能存在。
【问题讨论】:
-
where块未附加到表达式,即x where decls不是表达式(与let decls in x相比,它是表达式)。where块必须附加到声明中,在这种情况下,您可能希望它附加到addElem声明,因此必须放在声明主体之后,其中最后一个保护语句也构成了一部分。请注意,解析错误永远不会与使用错误的类型有关——这意味着编译器甚至不理解您的代码,更不用说判断它是错误的了。这也不是缩进错误。 -
@user2407038 这应该是一个答案
-
如果
index太大,你真的要忽略elem吗?与indexotherwise = list ++ [elem] 会有意义。