此代码来自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 }
他们为什么这样写?
答案 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
依此类推。
然而,出于这样的原因,意义之外,参数排序背后没有任何意义。