Haskell - 声明多个函数的类型

时间:2015-07-14 18:40:24

标签: haskell types declaration

我经常发现自己写的是同一类型的多个函数。我们称这种类型为FuncType。我可能写这样的东西:

funcA :: FuncType
funcB :: FuncType
funcC :: FuncType
funcD :: FuncType

-- Implementations

这感觉就像许多不必要的打字一样(键入键盘时键入,而不是声明功能类型)。有没有办法更简洁地做到这一点?我想要的东西看起来像是:

(funcA, funcB, funcC, funcD) :: FuncType

-- Implementations

我真的试着谷歌这个,但我空了。如果这不是该语言的一个特征,为什么不呢?我错过了什么吗?如果我发现自己需要这个,我会做错吗?

2 个答案:

答案 0 :(得分:18)

在没有括号的情况下做你的尝试。

funcA, funcB, funcC, funcD :: FuncType

Haskell 2010 report中,您可以在chapter 4 (Declarations and Bindings)中看到类型签名(gendecl)如下所示:

vars :: [context =>] type

vars看起来像这样:

var-1 , … , var-n

这正是您正在寻找的形式。

旁注:如果Haddock发现该文档围绕该(vars)列表中的每个符号的类型签名,它将会应用文档。

答案 1 :(得分:4)

除了MasterMastic的答案,您还可以实际使用类型声明为重复的类型指定名称:

-- | why GoodName is a good name
type GoodName = Complicated -> Function -> Type

-- | Foo explanation.
foo :: GoodName
foo = ...

-- | Bar explanation.
bar :: GoodName
bar = ...

这样,您只需要重复名称而不是可能更长的类型。这种风格优于foo, bar :: Complicated -> Function -> Type的好处包括:

  • 指定的类型用作文档
  • 命名类型可以在别处重复使用
  • 函数定义和类型签名彼此相邻
  • 您可以针对不同的功能使用不同的黑线鳕注释
  • 您的源代码看起来更加规律
  • 如果以后只有一个函数被重构以获取其他参数,则更改将更加本地化。

当然,您也可以将这些方法组合为foo, bar :: GoodName。由于类型推断,你通常甚至可以完全忽略类型签名,让编译器找出类型。