假设我有一些我想要命名的常量:
foo = 1234
bar = 5678
baz = 1337
默认情况下,类型为Num a => a
但是明确声明这些常量的类型不是一种好的做法吗?
这样做会非常冗长:
foo :: Int
foo = 1234
bar :: Int
bar = 5678
baz :: Int
baz = 1337
你可以这样做:
foo, bar, baz :: Int
foo = 1234
bar = 5678
baz = 1337
当没有太多但常数增加时,哪种方法可以正常工作,你可能需要对它们进行换行,而且,感觉就像是在重复自己。
这个怎么样?:
foo = 1234 :: Int
bar = 5678 :: Int
baz = 1337 :: Int
这会被认为是好风格吗?惯例是什么?
更新
实际上,似乎GHC并没有考虑最后一个具有任何类型声明的示例,因为它警告“没有类型签名的顶级绑定”。
答案 0 :(得分:4)
当然,这取决于你想要所有这些常量的原因。我个人倾向于给出明确的类型签名,是的。如果您有很多要申报的内容,我可能会选择
foo = 1234 :: Int
bar = 5678 :: Int
baz = 1337 :: Int
GHC可能会警告错过顶级类型声明,但上述绑定完全是单态的,因此您不需要支付运行时多态性惩罚,并且代码清晰可读。 (您可以在以后轻松添加更多条目。)
我可能会询问为什么你需要定义这么多的整数常量,并且谦虚地建议可能有一些更惯用的方法来实现你想要做的事情 - 但那将成为另一个问题的主题。对于手头的问题,基本上你建议的任何选项都是“很好”,但我个人的偏好(就是这样)就是上面的例子。