Haskell - 声明多个函数的类型

Haskell - Declaring the type of multiple functions

我经常发现自己用同一类型编写多个函数。我们称这种类型为 FuncType。我可能会这样写:

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

-- Implementations

这感觉像是很多不必要的打字(打字就像敲击键盘,而不是声明函数类型)。有没有办法更简洁地做到这一点?我想要的看起来类似于:

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

-- Implementations

我真的尝试 google 这个,但我一无所获。如果这不是该语言的特性,为什么不呢?我错过了什么吗?如果我发现自己需要这个,我是不是做错了什么?

按照您尝试过的操作进行操作(不带括号)。

funcA, funcB, funcC, funcD :: FuncType

Haskell 2010 report, you can see in chapter 4 (Declarations and Bindings) 中,类型签名 (gendecl) 如下所示:

vars :: [context =>] type

vars看起来像这样:

var-1 , … , var-n

这正是您要找的表格。


旁注:如果 Haddock 在该类型签名周围找到文档,它将应用文档 到该 (vars) 列表中的每个符号

除了 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。由于类型推断,您通常甚至可以完全省略类型签名,让编译器找出类型。