Haskell 为什么我不能使(函子f)=>;混凝土类型->;是否将字符串转换为实例函子((>;)具体类型?

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)

按照我构造类型的方式,我相信这将遵循函子定律,函子定律规定应该有一个标识函数,fmap将为该函数返回原始函子

代码:


考虑一下
函子的定义:

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