[英]Applicative Instance of Pair Data Type in Haskell
我正在嘗試將此對數據類型實現為應用仿函數,但我被告知“a”不在范圍內。 我認為已經在實例聲明中說明了“a”是什么。
data Pair a b = Pair a b deriving (Show)
instance Functor (Pair a) where
fmap f (Pair a b) = Pair a (f b)
instance Applicative (Pair a) where
pure x = Pair a x
Pair a f <*> Pair a' x = Pair (a + a') (f x)
a
是類型變量,不能在pure
的定義中使用。 pure
需要某種方法來獲取類型a
的值以與x
配對。 有幾種方法可以做到這一點:
b -> a
的函數,您可以將其應用於x
。() -> a
類型的函數,您可以將其應用於()
。a
一些預定義值。 (,) a
的Applicative
實例采用第三種方法,要求a
具有Monoid
實例,以便您可以根據mempty
定義pure
。
instance Monoid a => Applicative (Pair a) where
pure x = Pair mempty x
Pair a f <*> Pair a' x = Pair (a <> a') (f x)
在您的定義中,您假設(+)
是為a
值定義的,這意味着您缺少Num
約束,而且您可以在pure
的定義中簡單地使用0
。
instance Num a => Applicative (Pair a) where
pure x = Pair 0 x
Pair a f <*> Pair a' x = Pair (a + a') (f x)
您還可以通過應用於Sum a
的新Generically1
派生它
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE DerivingVia #-}
import GHC.Generics (Generic1, Generically1(..))
import Data.Monoid (Sum(..))
data Pair a b = Pair a b
deriving
stock (Show, Generic1)
deriving (Functor, Applicative)
via Generically1 (Pair (Sum a))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.