2016-03-02 26 views
2

一半時這裏...無可辯駁/懶人模式演習在Haskell維基

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似乎改變爲了「幫助」至少讓該功能表現得像的head常規部分版本,儘管在空列表情況下,不同的異常程度。對第二個問題的答案在我看來似乎是「不」,但考慮到「如果是,如何」增編,感覺我也必須在這裏錯過一些東西。任何人都可以啓發我嗎?不幸的是,頁面上的解決方案鏈接不包括此練習。

回答

7

我不確定wikibook的意思是「幫助」。你是正確的,改變訂單將使其行爲基本上像正常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'是wikibook的版本。 head1是交換子句的版本。 head2是第一個模式是與[]進行反駁匹配的版本。 ⊥被讀作「底部」並表示非終止或例外計算,即undefined

我會一直期待就像例子下面那裏有可反駁和無可辯駁的模式之間微妙但顯著差異:

konst ~() =() 

konst'() =() 

partialId ~(x:xs) = x:xs 

partialId' (x:xs) = x:xs 
+0

隨着遲來的感謝您有用的答案和道歉對任何其他違反禮儀兩年後回到這裏,我一直在回顧最後一部分的答案,並且無法找到任何方式從partialId和partialId中獲得不同的結果,以獲得我能想到的任何輸入。你能指出我的不同嗎? (我清楚地看到兩個konst變體之間的區別。) –