为什么类型参数和数据参数的顺序大多相反?

时间:2014-06-18 17:33:19

标签: haskell

此代码来自Learn you a haskell book

class Tofu t where
    tofu :: j a -> t a j

data Frank a b = Frank { frankField :: b a } 
                        deriving (Show)

instance Tofu Frank where
    tofu x = Frank x

我也见过类似的代码,其中类型参数和数据参数反转,如

data SomeData a b = SomeData { field1 :: b a }

他们为什么这样写?

1 个答案:

答案 0 :(得分:5)

类型参数的顺序几乎无关紧要。它不是无关紧要的一个地方通常是最后一个参数被类型化所影响。

最常见的例子是,如果你想将一个类型变量实例化为“获得fmap踩”的变量,它必须是最后一个。这与类

的定义有关
class Functor f where
  fmap :: (a -> b) -> f a -> f b

您可以看到f last 参数是由函数转换的参数。我们可以定义另一个执行倒数第二个参数槽

class Functor2 f where
  fmap2 :: (a -> b) -> f a x -> f b x

依此类推。

然而,出于这样的原因,意义之外,参数排序背后没有任何意义。