我经常发现自己写的是同一类型的多个函数。我们称这种类型为FuncType
。我可能写这样的东西:
funcA :: FuncType
funcB :: FuncType
funcC :: FuncType
funcD :: FuncType
-- Implementations
这感觉就像许多不必要的打字一样(键入键盘时键入,而不是声明功能类型)。有没有办法更简洁地做到这一点?我想要的东西看起来像是:
(funcA, funcB, funcC, funcD) :: FuncType
-- Implementations
我真的试着谷歌这个,但我空了。如果这不是该语言的一个特征,为什么不呢?我错过了什么吗?如果我发现自己需要这个,我会做错吗?
答案 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
。由于类型推断,你通常甚至可以完全忽略类型签名,让编译器找出类型。