List 如何正确使用Haskell中的防护装置?

List 如何正确使用Haskell中的防护装置?,list,function,haskell,List,Function,Haskell,我是Haskell的新手,我正在尝试编写简单的函数来熟悉语法,我想编写自己的函数,在特定索引处向列表中添加特定元素。以下是我在Atom(我的文本编辑器)中写的内容: addElem::a->[a]->Int->[a] 加法元素表索引 |索引,其中块需要出现在整个函数的末尾,并在所有情况下共享。您可能打算使用let: addElem :: a -> [a] -> Int -> [a] addElem elem list index | index <= 0

我是Haskell的新手,我正在尝试编写简单的函数来熟悉语法,我想编写自己的函数,在特定索引处向列表中添加特定元素。以下是我在Atom(我的文本编辑器)中写的内容:

addElem::a->[a]->Int->[a]
加法元素表索引

|索引
,其中
块需要出现在整个函数的末尾,并在所有情况下共享。您可能打算使用
let

addElem :: a -> [a] -> Int -> [a]
addElem elem list index
 | index <= 0            = elem:list
 | index < (length list) = let a = take index list; b = drop index list in a ++ (elem:b)
 | otherwise             = list
就我个人而言,我不太喜欢这一点,因为它表明
a
b
可以在函数的其他地方使用


的第4.4.3节更详细地介绍了允许使用
的位置。

A
where
块未附加到表达式,即
x,其中decls
不是表达式(与
let decls in x
相反,后者是表达式)。
where
块必须附加到声明中,在这种情况下,您可能希望它附加到
addElem
声明中,因此必须放在声明体之后,最后一个guard语句也是声明体的一部分。请注意,解析错误与使用错误的类型无关——这意味着编译器甚至不理解您的代码,更不用说判断它是错误的了。这也不是缩进错误。@user2407038这应该是一个答案如果
index
太大,你真的要忽略
elem
?与
index
小于0时预先添加元素相比,这有点不对称。我认为
否则=list++[elem]
是有意义的。
addElem :: a -> [a] -> Int -> [a]
addElem elem list index
 | index <= 0            = elem:list
 | index < (length list) = a ++ (elem:b)
 | otherwise             = list
 where
   a = take index list
   b = drop index list