Haskell 如何更改/提取手动定义的数据类型的一部分的值?

Haskell 如何更改/提取手动定义的数据类型的一部分的值?,haskell,types,data-manipulation,Haskell,Types,Data Manipulation,假设我有以下数据类型: data MyType = Element1 (Maybe Int) | Element2 (Maybe Int) instance1 = Element1 (Just 1) instance2 = function(instance1) 我可以用什么来代替函数,使instance2=Element1仅为2?如果稍微泛化类型,可以将其设置为函子: {-# LANGUAGE DeriveFunctor #-} data MyType a = Element1 (Maybe

假设我有以下数据类型:

data MyType = Element1 (Maybe Int) | Element2 (Maybe Int)
instance1 = Element1 (Just 1)
instance2 = function(instance1)

我可以用什么来代替函数,使instance2=Element1仅为2?

如果稍微泛化类型,可以将其设置为函子:

{-# LANGUAGE DeriveFunctor #-}
data MyType a = Element1 (Maybe a) | Element2 (Maybe a) deriving (Functor, Show)
如果您不想使用DeriveFunctor扩展,则手动定义该实例很简单

instance Functor MyType where
    fmap f (Element1 x) = Element1 (fmap f x)
    fmap f (Element2 x) = Element2 (fmap f x)

的专用版本如果稍微泛化类型,可以使其成为函子:

{-# LANGUAGE DeriveFunctor #-}
data MyType a = Element1 (Maybe a) | Element2 (Maybe a) deriving (Functor, Show)
如果您不想使用DeriveFunctor扩展,则手动定义该实例很简单

instance Functor MyType where
    fmap f (Element1 x) = Element1 (fmap f x)
    fmap f (Element2 x) = Element2 (fmap f x)

的专门版本给出了三个方程式:

instance1 = Element1 (Just 1)
instance2 = function(instance1)
instance2 = Element1 (Just 2)
让我们用这些方程来解函数

最后一行:

function (Element1 (Just 1)) = Element1 (Just 2)

是一段非常好的Haskell代码,它定义了一个名为function的函数。当然,它并没有说如何处理那些实际上是元素2的东西,或者那些元素1不包含任何东西,或者那些元素1包含的只是包含了不是1的东西!但它确实符合三个原始方程给出的规范,我认为这是哈斯克尔与数学共同的方程推理概念的一个极好的证明。

你给出了三个方程:

instance1 = Element1 (Just 1)
instance2 = function(instance1)
instance2 = Element1 (Just 2)
让我们用这些方程来解函数

最后一行:

function (Element1 (Just 1)) = Element1 (Just 2)

是一段非常好的Haskell代码,它定义了一个名为function的函数。当然,它并没有说如何处理那些实际上是元素2的东西,或者那些元素1不包含任何东西,或者那些元素1包含的只是包含了不是1的东西!但它确实符合三个原始方程式给出的规格,我认为这是哈斯克尔与数学共同的方程式推理概念的极好证明。

您可以使用记录语法定义数据类型:

data MyType = Element1 { x :: (Maybe Int) } | Element2 { x :: (Maybe Int)}
instance1 = Element1 (Just 1)
instance2 = instance1 { x = Just 2 }

您可以使用记录语法定义数据类型:

data MyType = Element1 { x :: (Maybe Int) } | Element2 { x :: (Maybe Int)}
instance1 = Element1 (Just 1)
instance2 = instance1 { x = Just 2 }

不能操纵对象。所有值都是不可变的。你可以构造一个新的对象,它是原始对象的一个更改副本。但是你想做什么还不完全清楚。我认为它是一个元素2什么都没有?还是元素1只是3?@WillemVanOnsem我编辑了这个问题,以反映对象的不可变性并澄清我的问题。你使用你不能操纵对象。所有值都是不可变的。你可以构造一个新的对象,它是原始对象的一个更改副本。但是你想做什么还不完全清楚。我认为它是一个元素2什么都没有?还是元素1只是3?@WillemVanOnsem我编辑了这个问题,以反映对象的不可更改性,并澄清我的问题。谢谢。但是,例如,如果a必须具有Int类型,有什么方法可以解决这个问题吗?您可以考虑使用mono可遍历库中的MonoFunctor类。否则,我相信您只需要编写自己的函数change::Int->MyType->MyType,类似于谢谢。但是,例如,如果a必须具有Int类型,有什么方法可以解决这个问题吗?您可以考虑使用mono可遍历库中的MonoFunctor类。否则,我相信您只需要编写自己的函数change::Int->MyType->MyType,类似于