我是否应该总是喜欢更一般的类型到特定类型?

时间:2011-10-05 04:40:28

标签: haskell polymorphism ghc

使用ghc --make编译,这两个程序生成完全相同的二进制文件:

-- id1a.hs
main = print (id' 'a')

id' :: a -> a
id' x = x

-- id1b.hs
main = print (id' 'a')

id' :: Char -> Char
id' x = x

这只是因为我的例子是多么微不足道/做作,或者这样做 当程序变得更复杂时,这是真的吗?

此外,是否有任何充分的理由避免使我的类型像一般 可能?我通常会尝试将细节保存在我不需要的地方,但是 我对编译语言的影响不是很熟悉, 特别是Haskell / GHC。

旁注:

我似乎记得最近的一个问题,答案是更多的类型 具体是为了改善一些性能问题,虽然我找不到它 现在,我可能已经想到了它。

修改

我从可用性/可组合性的角度理解,更通用的是总是更好,我对它对编译代码的影响更感兴趣。我是否有可能过于急切地抽象我的代码?或者这在Haskell中通常不是问题吗?

4 个答案:

答案 0 :(得分:7)

我会尽可能地使一切尽善尽美。如果你遇到性能问题,你可以开始考虑搞乱具体的实现,但恕我直言这不会经常出现问题,如果真的遇到问题,那么你的性能需求可能会考虑进入势在必行的领域再次;)

答案 1 :(得分:3)

  

有没有充分的理由避免让我的类型尽可能通用?

不,只要你有Specialize pragma可以随意处理那些可能真正重要的罕见情况。

答案 2 :(得分:2)

  

这只是因为我的例子是多么微不足道/设想

是。也就是说,尝试将id'main的定义拆分为不同的模块,您应该看到差异。

然而,Carsten是对的:使用具体类型可能存在与性能相关的原因,但通常应该从常规类型开始,并且只有在实际出现问题时才使用具体实现。

答案 3 :(得分:1)

在我看来,一般类型通常会使您的功能更加实用。

这可能是一个糟糕的例子,但如果您正在编写一个函数,例如 elem (获取列表和元素,如果列表包含该元素则返回true,否则返回false),特定类型将限制您的功能的可用性。即。如果将类型指定为Int,则不能使用该函数来检查String是否包含某个字符,例如。

我对性能不太确定,但我没有遇到任何问题,而且几乎所有时间都使用普通类型。