Tar*_*ing 5 haskell function list definition pattern-matching
所以这些函数命令在 GHCI 中有不同的行为:
safetailpatter xs = tail xs
safetailpatter [] = []
Run Code Online (Sandbox Code Playgroud)
safetailpatter [] = []
safetailpatter xs = tail xs
Run Code Online (Sandbox Code Playgroud)
前者传入时产生如下警告和如下错误 []
ex3.hs:66:1: warning: [-Woverlapping-patterns]
Pattern match is redundant
In an equation for ‘safetailpatter’: safetailpatter [] = ...
Run Code Online (Sandbox Code Playgroud)
*** Exception: Prelude.tail: empty list
Run Code Online (Sandbox Code Playgroud)
因此,定义的顺序很重要,为什么?我不明白为什么前者重叠而后者没有,因为给出了相同的定义。
xs也匹配空列表,因此safetailpatter []如果您safetailpatter xs先放置,则永远不会被调用。
我对 Haskell 很陌生,但我认为这就是正在发生的事情。
因此,当您safetailpatter xs首先放置然后使用空列表调用它时,您正在尝试调用tail空列表,并且您会收到异常。
至于
Pattern match is redundant
In an equation for ‘safetailpatter’: safetailpatter [] = ...
Run Code Online (Sandbox Code Playgroud)
我认为这基本上意味着我上面描述的内容,它抱怨声明是多余的,因为当您将后者放在首位时safetailpatter []已经涵盖了safetailpatter xs。
这就是为什么你应该总是把_你的模式匹配定义放在末尾,否则其余的模式永远不会被调用:
myF (x:xs) = -- ....
myF _ = -- ... -> Right
Run Code Online (Sandbox Code Playgroud)
myF _ = -- ... -> Wrong, now no the bellow definition will never get called
myF (x:xs) = -- ....
Run Code Online (Sandbox Code Playgroud)
模式按顺序匹配。但是,这里发生的事情是您实际上并没有在safetailpatter xs.
在常规英语中的safetailpatter xs = tail xs意思是:任何变量上的 safetailpatter 是该变量的尾部。
你想要匹配的是:safetailpatter (x:xs) = tail (x:xs),它代表:safetailpatter 当应用到至少有一个元素的列表时,是这样一个列表的尾部
知道这一点,在代码中
safetailpatter xs = tail xs
safetailpatter [] = []
Run Code Online (Sandbox Code Playgroud)
将按顺序检查,并且由于第一个方程匹配任何列表输入,您会在 上遇到运行时错误[]。然而
safetailpatter (x:xs) = tail xs
safetailpatter [] = []
Run Code Online (Sandbox Code Playgroud)
按顺序匹配,由于 []不匹配第一个方程,它将运行第二个,没有运行时错误
正如@chepner 所说,这称为无可辩驳的模式。这意味着模式匹配正在发生,但没有失败的机会。就像你匹配一样_
| 归档时间: |
|
| 查看次数: |
250 次 |
| 最近记录: |