Haskell-声明多个函数的类型

Haskell-声明多个函数的类型,haskell,types,declaration,Haskell,Types,Declaration,我经常发现自己用同一类型编写多个函数。让我们调用这个类型FuncType。我可以这样写: funcA :: FuncType funcB :: FuncType funcC :: FuncType funcD :: FuncType -- Implementations vars :: [context =>] type var-1 , … , var-n 这感觉像是很多不必要的键入(键入就像轻敲键盘一样,而不是声明函数类型)。有没有更简洁的方法?我想要的是以下几点: (funcA

我经常发现自己用同一类型编写多个函数。让我们调用这个类型
FuncType
。我可以这样写:

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

-- Implementations
vars :: [context =>] type
var-1 , … , var-n
这感觉像是很多不必要的键入(键入就像轻敲键盘一样,而不是声明函数类型)。有没有更简洁的方法?我想要的是以下几点:

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

-- Implementations

我真的想用谷歌搜索一下,但结果是空的。如果这不是语言的一个特点,为什么不呢?我错过什么了吗?如果我发现自己需要这个,我是不是做错了什么?

做你尝试过的没有括号的事情

funcA, funcB, funcC, funcD :: FuncType

在中,您可以看到类型签名(
gendecl
)如下所示:

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

-- Implementations
vars :: [context =>] type
var-1 , … , var-n
vars
如下所示:

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

-- Implementations
vars :: [context =>] type
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::complex->Function->Type
相比,这种样式的优点包括:

  • 命名类型用作文档
  • 命名类型可以在其他地方重用
  • 函数定义和类型签名彼此相邻
  • 对于不同的函数,可以有不同的haddock注释
  • 您的源代码看起来更规范
  • 如果以后只对其中一个函数进行重构以获取其他参数,则更改会更局部

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

真的吗!?真不敢相信我试过用括号,但没有。也许这对我来说在谷歌搜索时是显而易见的。不管怎样,谢谢你@我感觉到你:P谁没有去过那里。我将更新我的答案以在语言规范中显示出来。祝你好运<问题中的code>FuncType是一个较长的类型(或者至少在我写它的时候是这样),它有一个更方便的名称和一个类型声明。然而,我觉得让
FuncType
在代码中反复出现仍然是太过分了。尽管如此,我同意这并不总是最好的方式。我通常更喜欢将类型签名放在定义旁边,但有时情况并非如此。为了清楚起见,我想要在您呈现的代码上下文中实现的是:
foo,bar::GoodName
我在问题中添加了
foo,bar::GoodName
,还提到了类型推断。我知道你对MasterMastic的答案很满意,但我想为未来的读者描绘出设计空间。对于简短的表达,你可以写一些东西,比如
[x,y]=[3,4::Int]