Haskell fmap不适用于我的数据类型列表

Haskell fmap不适用于我的数据类型列表,haskell,Haskell,我已将我的数据类型定义为: data MyMaybe a = Lust a | Lothing deriving (Show,Eq,Ord,Functor, Foldable) 当我输入fmap+3 Lust 4时,它给出了正确的答案:Lust 7 但当我键入fmap+3[Lust 4,Lust 5]时,它不起作用,我得到以下错误: Non type-variable argument in the constraint: Num (MyMaybe a) 请告诉我如何解决此错误 看看fmap

我已将我的数据类型定义为:

data MyMaybe a = Lust a | Lothing deriving (Show,Eq,Ord,Functor, Foldable)
当我输入fmap+3 Lust 4时,它给出了正确的答案:Lust 7

但当我键入fmap+3[Lust 4,Lust 5]时,它不起作用,我得到以下错误:

Non type-variable argument in the constraint: Num (MyMaybe a)
请告诉我如何解决此错误

看看fmap的类型:

当你这样做的时候

fmap (+3) [Lust 4, List 5]
您正在列表[]上使用fmap,因此在本例中fa是Num b=>[myb]

fmap在列表上的实现是映射列表的所有元素。在本例中,元素是MyMaybe的。但您不能在MyMaybes上应用+3,因为它不是Num。如果您愿意,可以:

fmap (fmap (+3)) [Lust 4, List 5]
这将在列表的每个元素上应用功能fmap+3

可以使用ghci检查简单表达式的类型,例如:

Prelude> :t fmap (+3)
fmap (+3) :: (Functor f, Num b) => f b -> f b
显示fmap+3的参数必须是某个Num的函子查看fmap的类型:

当你这样做的时候

fmap (+3) [Lust 4, List 5]
您正在列表[]上使用fmap,因此在本例中fa是Num b=>[myb]

fmap在列表上的实现是映射列表的所有元素。在本例中,元素是MyMaybe的。但您不能在MyMaybes上应用+3,因为它不是Num。如果您愿意,可以:

fmap (fmap (+3)) [Lust 4, List 5]
这将在列表的每个元素上应用功能fmap+3

可以使用ghci检查简单表达式的类型,例如:

Prelude> :t fmap (+3)
fmap (+3) :: (Functor f, Num b) => f b -> f b
显示fmap+3的参数必须是某个Num的函子。在本例中,fmap+3适用于单个MyMaybe。如果要在列表上映射函数,则映射该函数。让我们给fmap+3起个名字:

我们现在可以看到,它只适用于一个MyMaybe。我们可以使用map或fmap将其用于列表:

map myMaybePlus3 [Lust 4, Lust 5]
但是由于引用的透明性,我们也可以简单地编写

map (fmap (+3)) [Lust 4, Lust 5]
因此,您所缺少的只是一个额外的fmap。

fmap+3适用于一个MyMaybe。如果要在列表上映射函数,则映射该函数。让我们给fmap+3起个名字:

我们现在可以看到,它只适用于一个MyMaybe。我们可以使用map或fmap将其用于列表:

map myMaybePlus3 [Lust 4, Lust 5]
但是由于引用的透明性,我们也可以简单地编写

map (fmap (+3)) [Lust 4, Lust 5]

因此,您所缺少的只是一个额外的fmap。

在代码中,您正在使用fmap遍历列表,并试图将+3应用于所有元素,但列表元素的类型为Num a=>mya

您需要应用fmap两次。一次用于像您所做的那样遍历列表,另一次用于遍历列表中的每个元素,该元素的类型也是Num a=>mya

因此,代码需要:


fmap fmap+3[Lust 4,Lust 5]

在代码中,您正在使用fmap遍历列表,并试图将+3应用于所有元素,但列表元素的类型为Num a=>mya

您需要应用fmap两次。一次用于像您所做的那样遍历列表,另一次用于遍历列表中的每个元素,该元素的类型也是Num a=>mya

因此,代码需要:


fmap fmap+3[Lust 4,Lust 5]

这是您列表中的打字错误吗?[Lust 4,List 5]不应该编译。是的,这是一个输入错误。你可以随时输入你的问题。这是你列表中的输入错误吗?[Lust 4,List 5]不应该编译。是的,它是一种类型,你可以随时回答你的问题。