所以我在Haskell中丢失了String元组.我宣布了一个类型:
type Book = [(String, String)]
然后我宣布一本空书:
emptyBook :: Book emptyBook = []
现在我想创建一个将元素插入到书中的函数.我的解决方案
insert :: String -> String -> Book -> Book insert a b emptyBook = (a,b) : [] insert a b (x : xs)= (a, b) : (x:xs)
但是函数插入不起作用.编译器加载模块但会发出警告"模式匹配是多余的".
执行插入"a" "1" [("b","2")]
使[("a","1")]
代替[("a","1"),("b","2")]
你知道这里出了什么问题吗?
我不明白为什么你:
用emptybook
你的模式匹配的部分,而不是[]
;
为什么你(x:xs)
在表达的左边和右边重复这两个部分;
区分空书和非空书.
因为Haskell像许多其他语言一样使用变量作用域,而Haskell emptybook
在您的函数中将其视为变量.它没有看到(至少不存在)emptybook
某个定义的函数.所以可以写:
insert a b c = (a,b) : []
以及(作为函数定义中的第二行).既然你定义了一个变量c
并且没有对它施加任何约束(守卫,模式......),它就会与所有东西相匹配:所以也是一本非空书.因此Haskell将始终占据第一线.事实上,编译器已经警告过你了.它说:
haskell.hs:9:1: Warning: Pattern match(es) are overlapped In an equation for ‘insert’: insert a b (x : xs) = ...
这意味着函数定义的最后一行与前一行重叠.在那种情况下,你可能做错了什么.
替代你可以简单地使用:
insert :: String -> String -> book -> book insert a b xs = (a,b) : xs
甚至更短:
insert :: String -> String -> book -> book insert a b = (:) (a,b)
此外,类型通常用大写字母表示,因此您最好使用Book
而不是book
.