gpt4 book ai didi

haskell - 为记录类型定义幺半群实例

转载 作者:行者123 更新时间:2023-12-04 01:36:26 25 4
gpt4 key购买 nike

假设我有一个类型

data Options = Options
{ _optionOne :: Maybe Integer
, _optionTwo :: Maybe Integer
, _optionThree :: Maybe String
} deriving Show

有更多的领域。我想定义一个 Monoid此类型的实例,其中 mempty值是 Options包含所有字段 Nothing .有没有比这更简洁的写法
instance Monoid Options where
mempty = Options Nothing Nothing Nothing
mappend = undefined

这将避免需要写一堆 Nothing s 当我的 Options还有更多的领域吗?

最佳答案

我建议只写 Nothing s,甚至明确拼出所有记录字段,这样您就可以确保在添加具有不同 mempty 的新字段时不会遗漏任何情况。值,或重新排序字段:

mempty = Options
{ _optionOne = Nothing
, _optionTwo = Nothing
, _optionThree = Nothing
}

之前没试过,不过好像可以用 generic-deriving为此目的打包,只要您记录的所有字段都是 Monoid s。您将添加以下语言编译指示和导入:
{-# LANGUAGE DeriveGeneric #-}
import GHC.Generics (Generic)
import Generics.Deriving.Monoid

添加 deriving (Generic)到您的数据类型并包装所有非 Monoid来自 Data.Monoid 的类型中的字段使用您想要的组合行为,例如 First , Last , Sum , 或 Product :
data Options = Options
{ _optionOne :: Last Integer
, _optionTwo :: Last Integer
, _optionThree :: Maybe String
} deriving (Generic, Show)

例子:
  • Last (Just 2) <> Last (Just 3) = Last {getLast = Just 3}
  • First (Just 2) <> First (Just 3) = First {getFirst = Just 2}
  • Sum 2 <> Sum 3 = Sum {getSum = 5}
  • Product 2 <> Product 3 = Product {getProduct = 6}

  • 然后使用来自 Generics.Deriving.Monoid 的以下函数使您的默认实例:
    memptydefault :: (Generic a, Monoid' (Rep a)) => a
    mappenddefault :: (Generic a, Monoid' (Rep a)) => a -> a -> a

    在上下文中:
    instance Monoid Options where
    mempty = memptydefault
    mappend = ...

    关于haskell - 为记录类型定义幺半群实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49517453/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com