当前位置:  开发笔记 > 编程语言 > 正文

元组字符串的模式匹配列表

如何解决《元组字符串的模式匹配列表》经验,为你挑选了1个好方法。

所以我在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")]

你知道这里出了什么问题吗?



1> Willem Van O..:

我不明白为什么你:

    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.

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有