僅在類型構造函數上多態的實例有什麼意義?

拉羅
{-# LANGUAGE FlexibleInstances, FlexibleContexts #-}

在 Haskell 中,我可以做類似的事情

class C a where
  c :: a -> a

instance C (f Integer) where
  c = id

正如所見, 的實例C是多態的,但僅在類型構造函數上而不是在類型參數上。這個功能有什麼意義?我從未見過它被使用過,但由於它是允許的,我認為在某些情況下它是有用的。是嗎?

丹尼爾·瓦格納

你已經看到它使用了。下面是一些例子:

return :: Monad m => a -> m a
and :: Foldable f => f Bool -> Bool
traverse :: (Applicative f, Traversable t) => (a -> f b) -> t a -> f (t b)

這些中的每一個在具有箭頭類型的類型中都是多態的——分別是m, f, 以及兩者ft如果您必須在實例頭中看到它,那麼將其中任何一個提升到一個類似的實例並不難。例如:

class Bullish a where bull :: a -> Bool
instance Bullish Bool where bull = id
instance Bullish Int where bull = (0/=)
instance Foldable f => Bullish (f Bool) where bull = and

作為術語說明:“類型構造函數”實際上並不是“帶有箭頭類型的類型”的同義詞,其原因基本上與“數據構造函數”與“帶有箭頭類型的值”不相同的原因。

                   arrow kind    not arrow kind
constructor        Maybe         Bool
not constructor    State Int     Maybe Char

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

當傳遞的參數是自定義類型時,顯式構造函數會帶來什麼價值?

具有公共構造函數的私有類型的表驅動測試

無法使用構造函數創建類 ViewModel 的實例

如果一個函數定義有一個類模板類型的參數並且沒有使用它(它的成員),那麼它是否被實例化?

C++ 沒有構造函數實例匹配參數列表 e0289

getopt_long 函數中“:”的意義是什麼?

C++ LinkedList 類中的多個構造函數:非類類型“ClassName”

為什麼這個參數構造函數只適用於多行定義?

異步函數的 neverthrow 有什麼意義?

相同接口的 StructureMap,但具有不同構造函數參數的多個實例

C++ 在構造函數中將 0 分配給類變量時會發生什麼

為什麼 C 允許返回與函數返回類型不同的類型?

使用“隱式解包可選”作為函數參數類型有什麼意義?

如何使用不同的構造函數從堆棧中實例化一個類?

多態中從引用到父類的構造函數

重構 golang 函數——應該使用什麼類型?

為什麼我可以在結構的類型參數中編寫函數類型?

為什麼要指定函數返回類型?

使用泛型時,構造函數和構建器之間有什麼區別?

為這個數據類型定義一個函子實例

Fortran 中未調用派生類型的自定義構造函數

為什麼多態函數不能接受 Scala 中的通配符(存在)類型?

從方法返回實例化類並將數據傳遞給構造函數 PHP

如何分離派生類構造函數的定義和實現?

c++98 僅當 InputIt 是 T 類型的迭代器時才使用迭代器構造函數

為什麼我在構造函數中填充的這個數組在構造函數返回後沒有填充?

C++20 中兩種類型的模塊文件(接口和實現)有什麼意義?

我什麼時候需要 Spring 實體中的構造函數?

Java - 為什麼可以聲明一個父類類型的數組並實例化為子類?