Haskell 为什么我不能使(函子f)=>;混凝土类型->;是否将字符串转换为实例函子((>;)具体类型?
按照我构造类型的方式,我相信这将遵循函子定律,函子定律规定应该有一个标识函数,fmap将为该函数返回原始函子 代码:Haskell 为什么我不能使(函子f)=>;混凝土类型->;是否将字符串转换为实例函子((>;)具体类型?,haskell,types,functor,arrows,Haskell,Types,Functor,Arrows,按照我构造类型的方式,我相信这将遵循函子定律,函子定律规定应该有一个标识函数,fmap将为该函数返回原始函子 代码: 考虑一下函子的定义: class Functor f where fmap :: (a -> b) -> f a -> f b 类或方法不约束类型a和b,因此您定义的任何fmap必须适用于任何类型a和b。您可以定义自己的类型类,例如: class MyFunctor f where myfmap :: (String -> String)
考虑一下
函子的定义:
class Functor f where
fmap :: (a -> b) -> f a -> f b
类或方法不约束类型a
和b
,因此您定义的任何fmap
必须适用于任何类型a
和b
。您可以定义自己的类型类,例如:
class MyFunctor f where
myfmap :: (String -> String) -> f String -> f String
但这不会是你过度专业化的函子
函子的定义如下:
class Functor f where
fmap :: (a -> b) -> f a -> f b
其思想是,它接受一个正常的函数,并将其提升到某个上下文中。但不仅仅是这样:其思想是它接受任何正常的函数并将其提升到上下文中。对于列表函子,fmap
可以接受任何函数,并在适当类型的列表上执行它
你所做的就是总是从你的函子中返回相同的类型,这违背了它作为函子的目的,因此Haskell是不允许的。很好的一点-我以为我已经计算出了类型,但我猜凌晨1点的编码对你来说就是这样的。我回去试着找出要遵守fmap的类型,但做不到。
class MyFunctor f where
myfmap :: (String -> String) -> f String -> f String
class Functor f where
fmap :: (a -> b) -> f a -> f b