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
。由于类型推断,您通常甚至可以完全省略类型签名,让编译器找出类型。
我经常发现自己用同一类型编写多个函数。我们称这种类型为 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
。由于类型推断,您通常甚至可以完全省略类型签名,让编译器找出类型。