Haskell中的通用默认值

Cli*_*ton 8 haskell ghc

有两个功能:

f :: (A a, B b) => a -> b
g :: (B b, C c) => b -> c
Run Code Online (Sandbox Code Playgroud)

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

h x = g (f x)
Run Code Online (Sandbox Code Playgroud)

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

h x = g ((f x) :: T)
Run Code Online (Sandbox Code Playgroud)

f x如果没有指定,则有一些"默认类型" ?

我怀疑我需要在Haskell Prime中使用Defaulting这样的东西,但这是在GHC(或GHC主管)中实现的吗?

Dan*_*ton 1

愚蠢的不回答:

asT :: T -> T
asT = id

h = g . asT . f
Run Code Online (Sandbox Code Playgroud)

缺乏“默认”是 Haskell 泛型风格的痛点之一。事情变得太通用了,Haskell 不知道该选择哪个实例。现状是“程序员需要明确地解决歧义”。您无需指定默认的顶级规则,只需根据具体情况选择适当的实例即可。Num违约是这条规则的一个特例。

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

default A (Int, String, ())
default B (String, Int, ())
(A t, B t) => t -- defaults to what?
Run Code Online (Sandbox Code Playgroud)