为什么haskell强制总是键入泛型类型?

时间:2017-02-09 17:44:24

标签: haskell types

让我们说:

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

4 个答案:

答案 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 ...