我缺少什么關鍵的直覺來理解這段代碼?我不明白這些是如何組成的。首先需要一個函式(a->c)和構造型別(fab)。然而,第二次產生(時尚)。此外,first 和 second 是根據看起來是圓形的 bimap 定義的。
class Bifunctor f where
bimap :: (a -> c) -> (b -> d) -> f a b -> f c d
bimap g h = first g . second h
first :: (a -> c) -> f a b -> f c b
first g = bimap g id
second :: (b -> d) -> f a b -> f a d
second = bimap id
uj5u.com熱心網友回復:
second是咖喱。您可以撰寫隱含引數,它將與 對稱first。
first g = bimap g id
second g = bimap id g
至于你關于定義是否回圈的問題,答案是肯定的。它們是圓形的。根據對Haskell標準的嚴格閱讀,以下實作是正確的
data F a b = F a b
instance Bifunctor F -- No functions implemented; take all three defaults
這將根據 Haskell 標準進行編譯。first但是任何呼叫,second或的嘗試bimap都會觸底,因為他們只會永遠互相呼叫。
但是,如果您查看 的源代碼,Bifunctor還有另一個小注釋。
{-# MINIMAL bimap | first, second #-}
這不是一條普通的評論。這是針對 GHC(最流行的 Haskell 編譯器)的特殊指令。GHC 特別支持最小指令。這宣告了一個實體Bifunctor只有在它至少 bimap實作或同時實作firstand時才是完整的second。所以在 GHC 上,如果你自己的條件不滿足instance,你會得到一個編譯器錯誤。這也反映在Hackage 檔案中
最小完整定義
bimap | first, second
期望您作為程式員覆寫其中的一些默認值,而其余的默認值可以默默地到位。
您可以在內置型別類中更直接地看到相同的行為Eq
class Eq a where
(==), (/=) :: a -> a -> Bool
{-# INLINE (/=) #-}
{-# INLINE (==) #-}
x /= y = not (x == y)
x == y = not (x /= y)
{-# MINIMAL (==) | (/=) #-}
兩者(==)和(/=)都是相互實作的,MINIMAL底部有一個指令,指示任何實體必須至少實作這兩個函式中的一個。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/528522.html
標籤:哈斯克尔
上一篇:特定型別結構的合并演算法
