让我们说:
data Data a b c = Build (a,b,c) deriving Show
foo :: Data a b c -> Data a b c
foo d = d
main = print $ foo $ Build (1, 1, "a")
有没有办法避免每次使用数据类型时写a b c
?
使用类型:
foo :: Data -> Data
foo d = d
答案 0 :(得分:11)
是的,确定:
foo :: d ~ Data a b c => d -> d
答案 1 :(得分:8)
data Data a b c = Build (a,b,c) deriving Show
type D a t a' = Data a t a'
foo :: D a t a' -> D a t a'
foo d = d
别名很有趣,但这不是一个严肃的答案。
编辑:一个严肃的版本,如果您知道一个共同的单态类型,那么别名就会变得有用:
type AppData = Data AppState AppValue AppResult
foo :: AppData -> AppData
...
答案 2 :(得分:3)
您可以用type
同义词包装多态类型。
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TypeOperators #-}
type d ~> d' = forall a b c. d a b c -> d' a b c
foo :: Data ~> Data
foo d = d
虽然写出类型变量可能更简单。
答案 3 :(得分:0)
因为Data
不是类型而是类型构造函数。如果您更喜欢一个需要3种类型并返回新类型的函数。类型构造函数还可以键入其他类型构造函数作为参数示例
data D d a= D (d a a a)
然后,我可以使用您的Data
(不带参数)D Data a
...