List 如何正确使用Haskell中的防护装置?
我是Haskell的新手,我正在尝试编写简单的函数来熟悉语法,我想编写自己的函数,在特定索引处向列表中添加特定元素。以下是我在Atom(我的文本编辑器)中写的内容: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
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节更详细地介绍了允许使用的位置。Awhere
块未附加到表达式,即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