簡體   English   中英

Haskell中Pair數據類型的應用實例

[英]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配對。 有幾種方法可以做到這一點:

  1. 類型為b -> a的函數,您可以將其應用於x
  2. () -> a類型的函數,您可以將其應用於()
  3. a 類型a一些預定義值。

(,) aApplicative實例采用第三種方法,要求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 aGenerically1派生它

{-# 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.

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