Haskell中的通用默认值

时间:2015-02-19 14:35:41

标签: haskell ghc

有两个功能:

f :: (A a, B b) => a -> b
g :: (B b, C c) => b -> c

有没有办法(在GHC中)我可以写:

h x = g (f x)

无需为f x添加类型签名,例如

h x = g ((f x) :: T)

通过一些"默认类型"如果没有指定,f x会占用什么?

我怀疑我需要像Defaulting in Haskell Prime这样的东西,但这是在GHC(或GHC负责人)中实现的吗?

1 个答案:

答案 0 :(得分:1)

愚蠢的非答案:

asT :: T -> T
asT = id

h = g . asT . f

缺乏"违约"是Haskell的仿制药味道之一。事情变得过于笼统,Haskell并不知道要选择哪个实例。现状是"程序员需要明确解决歧义。"您只需根据具体情况选择适当的实例,而不是指定默认的顶级规则。 Num违约是这条规则的一个骇人听闻的例外。

您链接的提案有一个很好的例子,说明为什么在涉及多个类时,选择默认值并不是一件容易的事。

default A (Int, String, ())
default B (String, Int, ())
(A t, B t) => t -- defaults to what?