在使用 Alternative Alt 的 Monoid 和 Semigroup 實體中。
為什么沒有它我們不能寫實體?
{-# LANGUAGE FlexibleInstances #-}
instance Alternative f => Semigroup (f a) where
(<>) = <|>
instance Alternative f => Monoid (f a) where
mempty = empty
如果我們可以這樣寫,那么我們可以在函式中用 (Monoid (fa), Applicative f) 替換 Alternative 嗎?
uj5u.com熱心網友回復:
您可以使用它來推導Monoid任何Alternative
{-# Language DerivingVia #-}
data F a = ..
deriving (Semigroup, Monoid)
via Alt F a
instance Functor F where ..
instance Applicative F where ..
instance Alternative F where ..
Alt有充分理由成為一種新型別,因為有許多方法可以描述Monoid應用型別的行為f a。例如Applicative提升:Ap .
{-# Language DerivingVia #-}
data G a = ..
deriving (Semigroup, Monoid, Num, Bounded)
via Ap G a
instance Functor G where ..
instance Applicative G where ..
您提供的實體最大程度地重疊,Monoid任何應用型別的實體現在都強制成為Alternative實體,完全忽略a引數。
在許多情況下,這是不正確的,例如Semigroup a => Semigroup (Maybe a)is not the same as Alternative Maybe。
可以使用一個相當新的特性QuantifiedConstraints來量化型別建構式的引數forall x. Monoid (f x)。這不相同Alternative但相似
{-# Language QuantifiedConstraints #-}
..
type Alternative' :: (Type -> Type) -> Constraint
class (forall x. Monoid (f x)) => Alternative' f
instance (forall x. Monoid (f x)) => Alternative' f
uj5u.com熱心網友回復:
你使用(<|>) :: Alternative f => f a -> f a -> f a和empty :: Alternative f => f a。正如簽名所暗示的那樣,這些是為 type 的專案定義的Applicative f => f a。因此,您只能使用這些函式來處理此類專案,因此這要求如果您使用 anf a來定義mempty :: f awith mempty = empty,那么這就要求它f是 typeclass 的Alternative成員。
話雖這么說,雖然很多資料型別都可以根據實作方式定義實體Semigroup,但這本身并不是最好的實體。Yes是應用函子上的幺半群,但它本身不應該是這些資料型別上的幺半群實體。MonoidAlternativeAlternative
uj5u.com熱心網友回復:
如果您建議的實體以該形式存在,則匹配的每個型別f a都會立即服從它。這包括有意義的型別,但請考慮
newtype ResultsSum a = ResultsSum {funToSum :: a -> Int}
instance Semigroup (ResultsSum a) where
ResultsSum p <> ResultsSum q = ResultsSum $ \x -> p x q x
不幸的是,ResultsSum a比賽f a。但它不是Alternative; 它甚至不是函子,也不可能是(相反,它是Contravariant)。然而,編譯器在決議實體時并沒有考慮到這一點:它只看到兩個實體宣告,它們的頭部都聲稱能夠ResultsSum成為一個半群,這會觸發一個歧義實體錯誤。
誠然,這個例子可以用{-# OVERLAPPING #-}pragma 來解決,但是最好避免實體重疊,因為它們會導致奇怪。這是不必要的,因為您還可以將這些實體派生via為Alternative一個。盡管我個人實際上更愿意以相反的方式來做:Monoid首先定義實體,然后Alternative根據它來定義實體。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/536661.html
上一篇:顯示類貨幣Haskell
下一篇:Haskell:卡片的價值,功能
