簡體   English   中英

Haskell:Num類型的模式匹配

[英]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如何與許多其他語言不同,這里有兩個重要的觀察結果:

  1. 並非所有類型都定義了相等的概念。 除非xy的類型具有Eq實例,否則無法詢問是否x == y
  2. 數字類型集不是固定的。 數字文字可以采用任何具有Num實例的類型 您可以定義自己的類型並使其成為Num的實例,並且它不一定也必須具有Eq的實例。 因此,並非所有“數字”都可以進行平等比較。

因此,它是不夠你的功能的情況下h是“ a必須是一個數字。” 上下文必須是,更具體地,“ a必須含有一個相等測試的數”,以確保有檢查是否一個方式x等於0 ,以執行模式匹配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM