[英]Haskell: pattern matching on Num types
為什么Haskell不能在Num
類型上執行模式匹配,而沒有我們將Eq
指定為類型類?
例如:
h :: Num a => a -> a
h 0 = -1
h x = x + 1
編譯此函數時, ghci
抱怨:
* Could not deduce (Eq a) arising from the literal `0'
from the context: Num a
bound by the type signature for:
h :: forall a. Num a => a -> a
at functions.hs:9:1-20
Possible fix:
add (Eq a) to the context of
the type signature for:
h :: forall a. Num a => a -> a
* In the pattern: 0
In an equation for `h': h 0 = - 1
|
10 | h 0 = -1
| ^
更改函數定義如下編譯並完美運行:
h :: (Num a, Eq a) => a -> a
h 0 = -1
h x = x + 1
*Main> h 0
-1
*Main>
來自Haskell 2010報告 ,標題為模式匹配的非正式語義 :
如果v
==
k,則將數字,字符或字符串文字模式k與值v匹配成功
因此,當您使用文字(例如0
)作為模式時,其含義取決於==
( Eq
類的方法)。
例如,你的功能h
h 0 = -1
h x = x + 1
可以改寫為
h x | x == 0 = -1
h x = x + 1
您(隱式)使用==
方法,因此您需要Eq
約束。
關於Haskell如何與許多其他語言不同,這里有兩個重要的觀察結果:
x
和y
的類型具有Eq
實例,否則無法詢問是否x == y
。 Num
實例的類型 。 您可以定義自己的類型並使其成為Num
的實例,並且它不一定也必須具有Eq
的實例。 因此,並非所有“數字”都可以進行平等比較。 因此,它是不夠你的功能的情況下h
是“ a
必須是一個數字。” 上下文必須是,更具體地,“ a
必須含有一個相等測試的數”,以確保有檢查是否一個方式x
等於0
,以執行模式匹配。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.