我不知道为什么fmap _ a = a
下面是非法的。这是代码:
data Sum a b = First a | Second b
instance Functor (Sum a) where
fmap f (Second b) = Second (f b)
fmap _ (First a) = First a
fmap _ a = a -- Why can't I do this instead?
另一个问题是,这是否会影响性能,还是仅在编译时才会发生?
你需要调用构造函数重新创建一个新的价值,所以它也会有不同的类型比你开始与一个。
fmap :: (b -> c) -> Sum a b -> Sum a c
fmap (f :: b -> c) :: Sum a b -> Sum a c
fmap (f :: b -> c) (x :: Sum a b) -> Sum a c
a :: a a :: a
First a :: Sum a b First a :: Sum a c
b :: b c :: c
Second b :: Sum a b Second c :: Sum a c
定a :: a
,First a
具有类型Sum a t
与t
通过其中的上下文确定First a
出现。两个First a
等号的两侧定义两个不同的值,每个它自己的类型。使用a
右侧的变量,它仍然引用Sum a b
与左侧相同的类型值。但是我们需要一个不同的类型,根据fmap
.
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句