Haskell 常量的类型声明

Haskell 常量的类型声明,haskell,syntax,type-declaration,Haskell,Syntax,Type Declaration,假设我想命名一些常量: 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
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似乎不考虑最后一个例子有任何类型声明,因为它警告“顶级绑定没有类型签名”。

当然,这要取决于为什么您想要所有这些常量。我个人倾向于给出明确的类型签名,是的。如果你有很多东西要申报,我可能会去

foo = 1234 :: Int
bar = 5678 :: Int
baz = 1337 :: Int
GHC可能会警告缺少顶级类型声明,但上面的绑定是完全单态的,因此您不必支付运行时多态性惩罚,代码清晰可读。(以后您可以轻松添加更多条目。)


我可能会问你为什么需要定义这么多整型常量,并谦恭地建议可能有更惯用的方法来实现你想要做的事情——但这将是另一个问题的主题。就目前的情况而言,基本上您建议的任何选项都是“好的”,但我个人的偏好(仅此而已)就是上面的例子。

实际上,由于单态限制,默认类型不会是
Num a=>a
。但是,默认情况下,GHC可能选择不同的类型,所以它仍然是一个重要的问题。我更喜欢这个版本<代码> FO、Bar、BZ::INT/COM>,但这是一个味觉的问题。事实上,GHC似乎不考虑最后一个示例有任何类型声明,因为它警告过。“没有类型签名的顶级绑定”。你可以随意做,我更喜欢最后一个。(如果你喜欢简洁,你也可以做
foo,bar,baz::Int
(foo,bar,baz)=(123456781337),但你的最后一个仍然是最清晰的。)
foo,bar,baz::Int
then definitions样式是最流畅的,但它对于Haddock的源代码导航来说并不太好。因此,我更喜欢在下面直接使用它们的定义编写单类型签名。我很清楚这样做并不惯用。在这种情况下,它是对C库的绑定。我将用还有一些事情。@EmilEriksson我怀疑可能是这样的……虽然在那种情况下,这些常量不是由某个工具自动生成的吗?(在这种情况下,无论键入多少次都无关紧要。)是的,我可能应该使用hsc2hs或c2hs,但我想先用手试试。