Irrefutable/lazy Haskell wikibook 中的模式练习
Irrefutable/lazy pattern exercise in Haskell wikibook
到这里的一半...
https://en.wikibooks.org/wiki/Haskell/Laziness
...是一项练习,询问对使用无可辩驳模式的 head
函数的替代实现进行更改的影响。它提供了 head'
的定义如下,并指出由于第一个等式的无可辩驳的匹配,它总是 return undefined
:
head' :: [a] -> a
head' ~[] = undefined
head' ~(x:xs) = x
然后它会问:
- 为什么将方程式的顺序更改为
head'
在这里没有帮助?
- 如果将第一个等式更改为使用普通的可反驳模式,
head'
的行为仍然与 head
的行为不同吗?如果
那么,如何?
在 GHC 7.8.4 中,似乎更改顺序 "helps" 至少可以使此函数的行为类似于 head
的常规部分版本,尽管在空列表案例。第二个问题的答案在我看来是 "no",但考虑到 "if so, how" 附录,感觉我一定也遗漏了一些东西。谁能启发我?不幸的是,页面上的解决方案 link 并未涵盖此练习。
我不确定 wikibook "help" 是什么意思。您是正确的,更改顺序将使它的行为基本上像正常的 head
。同样,您是正确的,使第一个模式可反驳也会使其表现得像 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'
是来自维基百科的版本。 head1
是交换了子句的版本。 head2
是第一个模式是针对 []
的可反驳匹配的版本。 ⊥ 读作 "bottom" 表示非终止或异常计算,即 undefined
.
我所期望的是像下面这样的示例,其中可反驳模式和不可反驳模式之间存在细微但显着的差异:
konst ~() = ()
konst' () = ()
partialId ~(x:xs) = x:xs
partialId' (x:xs) = x:xs
到这里的一半...
https://en.wikibooks.org/wiki/Haskell/Laziness
...是一项练习,询问对使用无可辩驳模式的 head
函数的替代实现进行更改的影响。它提供了 head'
的定义如下,并指出由于第一个等式的无可辩驳的匹配,它总是 return undefined
:
head' :: [a] -> a
head' ~[] = undefined
head' ~(x:xs) = x
然后它会问:
- 为什么将方程式的顺序更改为
head'
在这里没有帮助? - 如果将第一个等式更改为使用普通的可反驳模式,
head'
的行为仍然与head
的行为不同吗?如果 那么,如何?
在 GHC 7.8.4 中,似乎更改顺序 "helps" 至少可以使此函数的行为类似于 head
的常规部分版本,尽管在空列表案例。第二个问题的答案在我看来是 "no",但考虑到 "if so, how" 附录,感觉我一定也遗漏了一些东西。谁能启发我?不幸的是,页面上的解决方案 link 并未涵盖此练习。
我不确定 wikibook "help" 是什么意思。您是正确的,更改顺序将使它的行为基本上像正常的 head
。同样,您是正确的,使第一个模式可反驳也会使其表现得像 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'
是来自维基百科的版本。 head1
是交换了子句的版本。 head2
是第一个模式是针对 []
的可反驳匹配的版本。 ⊥ 读作 "bottom" 表示非终止或异常计算,即 undefined
.
我所期望的是像下面这样的示例,其中可反驳模式和不可反驳模式之间存在细微但显着的差异:
konst ~() = ()
konst' () = ()
partialId ~(x:xs) = x:xs
partialId' (x:xs) = x:xs