Home Articles

Haskell wikibook中的无可辩驳/懒惰模式练习

Asked
Viewed 1167 times
2

在这里的一半......

https://en.wikibooks.org/wiki/Haskell/Laziness

...是一个练习,询问使用无可辩驳模式的 head 函数的替代实现的更改的影响 . 它提供了 head' 的定义如下,注意由于第一个等式的无可辩驳的匹配,它将始终返回 undefined

head' :: [a] -> a
head' ~[]     = undefined
head' ~(x:xs) = x

然后它问:

  • 为什么不在这里改变方程的顺序为 head'

  • 如果第一个等式被改为使用普通的可反复模式,那么 head' 的行为是否仍然与 head 的行为不同?如果是这样,怎么样?

在GHC 7.8.4中,似乎更改顺序"helps"至少使得此函数的行为类似于 head 的常规部分版本,尽管在空列表情况下有不同的异常 . 第二个问题的答案对我来说似乎是"no",但鉴于"if so, how"附录,我觉得我也必须在这里遗漏一些东西 . 任何人都可以开导我吗?不幸的是,页面上的解决方案链接并未涵盖此练习 .

1 Answer

  • 7

    我不确定wikibook是什么意思"help" . 你是正确的,改变顺序将使它的行为基本上像普通的 head . 同样,你是正确的,使第一个模式refutable也会使它的行为像 head . 我要说这些问题很混乱;他们肯定令人困惑 .

    我们可以通过计算验证这些答案(包括用GHC计算):

    head [] = ⊥
    head (x:xs) = x
    head ⊥ = ⊥
    
    head' [] = ⊥
    head' (x:xs) = ⊥
    head' ⊥ = ⊥
    
    head1 [] = ⊥
    head1 (x:xs) = x
    head1 ⊥ = ⊥
    
    head2 [] = ⊥
    head2 (x:xs) = x
    head2 ⊥ = ⊥
    

    head 是标准库版本 . head' 是wikibook的版本 . head1 是交换了子句的版本 . head2 是第一个模式与 [] 的可重写匹配的版本 . ⊥读作"bottom"并表示非终止或异常计算,即 undefined .

    我所期望的是如下例子,其中可反驳和无可辩驳的模式之间存在细微但显着的差异:

    konst ~() = ()
    
    konst' () = ()
    
    partialId ~(x:xs) = x:xs
    
    partialId' (x:xs) = x:xs
    

Related