haskell - Haskell 中的通用默认值

标签 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 头)中实现?

最佳答案

愚蠢的不回答:

asT :: T -> T
asT = id

h = g . asT . f

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

您链接的提案有一个很好的例子,说明为什么在涉及多个类时选择默认值并非易事。
default A (Int, String, ())
default B (String, Int, ())
(A t, B t) => t -- defaults to what?

关于haskell - Haskell 中的通用默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28609023/

相关文章:

haskell - 使用 Template Haskell 在编译时评估函数

scala - 从 Scala 中的字符串读取案例类对象(类似于 Haskell 的 "read"类型类)

haskell - GADT 类型的奇怪类型推理行为(对于固定长度向量)

haskell - 无法使用堆栈构建带有模块导入的项目(在 Windows 上)

Haskell/GHC UndecidableInstances - 非终止类型检查的示例?

haskell - 可见类型应用程序是 `Proxy` 参数的安全替代方案吗?

function - 编写我的第一个 Haskell 函数时出现问题

haskell - Bool 类 - 像 Num?

haskell - 使用箭头生成深度嵌套的记录

haskell - 在什么情况下通用子表达式消除会影响 Haskell 程序的惰性?