繁体   English   中英

fmap在我的数据类型列表上不起作用

[英]fmap does not work on list of my datatype

我已将数据类型定义为:

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 (+3)适用于单个 MyMaybe 如果要在列表上映射功能,则可以映射该功能。 让我们给fmap (+3)命名:

myMaybePlus3 :: Num a => MyMaybe a -> MyMaybe a
myMaybePlus3 = fmap (+3)

现在我们可以看到它仅适用于单个MyMaybe 我们可以使用map (或fmap )将其用于列表:

map myMaybePlus3 [Lust 4, Lust 5]

但是由于参照透明性,我们也可以简单地编写

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

因此,您所缺少的只是一张附加的(f)map

查看fmap的类型:

fmap :: Functor f => (a -> b) -> f a -> f b

当你做

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

您正在列表[]上使用fmap ,因此在这种情况下, faNum b => [MyMaybe b]

fmap在列表上的实现是映射列表的所有元素。 在这种情况下,元素是MyMaybe's 但是您不能在MyMaybe上应用+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)函数

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

您需要两次应用fmap 一次用于遍历列表,另一遍用于遍历列表中的每个元素,该元素再次具有Num a => MyMaybe a

所以代码需要是:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM