簡體   English   中英

是否可以在 Haskell 中否定類型參數約束?

[英]Is it possibile to negate type parameter constraint in Haskell?

在 Haskell 中,可以向類型參數添加約束。

例如:

foo :: Functor f => f a

問題:是否可以否定約束?

我想說f可以是除Functor之外的任何東西。

升級版:

所以它來自如何將 map 底部嵌套的 Functor 的想法。 假設我有Functor a其中a可以是Functor b也可以不是,並且相同的規則適用於b

這不可能的原因:(基本上都是相同的原因,只是它的不同方面)

  • 關於類型類有一個開放世界的假設 不可能證明一個類型不是 class 的實例,因為即使在編譯模塊期間,該實例不存在,這並不意味着有人沒有在模塊中定義它“進一步向下馬路”。 這原則上可以在一個單獨的 package 中,這樣編譯器就不可能知道該實例是否存在。
    (這種孤兒實例通常很不受歡迎,但它們有一些用例,並且語言不會試圖阻止這種情況。)
  • class 中的成員資格是一個直觀的屬性,這意味着您不應將其視為經典的 boolean 值“實例或非實例”,而是,如果您可以證明一個類型是實例,那么這將為您提供某些特性類型(由 class 方法指定)。 如果你不能證明該類型是一個實例,那么這並不意味着沒有實例,而可能只是你不夠聰明來證明它。 (閱讀,“也許沒有人足夠聰明”。)
    這與第一點有關:編譯器還沒有可用的實例是“不夠聰明”的一種情況。
  • class 不應該用於對類型是否在其中進行調度,而是用於啟用某些多態函數,即使它們需要類型的臨時條件。 這就是 class 方法所做的,它們可以來自 class 實例,但它們怎么可能來自“非同類實例”?

現在,說了這么多,一種方法可以偽造這個:使用重疊的實例 不要這樣做,這是一個壞主意,但是......這是你能得到的最接近的。

暫無
暫無

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

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