【问题标题】:Haskell declarations to mach a type scheme用于处理类型方案的 Haskell 声明
【发布时间】:2019-03-13 10:36:15
【问题描述】:

我想知道什么 Haskell 类型声明会匹配下面的类型方案?

∀a,b.H(a → b) ⇒ b

这是来自4.1 Unambiguity / A Theory of Overloading


稍后在chi 的回答之后编辑。 我试过这段代码,但我不能让它失败

class H f where 
  g :: f -> Bool

instance H (Integer -> Bool) where
  g f = f 0

instance H (Char -> Bool) where
  g f = f '1'

g (\x -> if x > 10 then True else False)

g (\x -> if x == '0' then True else False)

另外,我意识到,对于此代码,无法通过添加类似 | b -> a 的函数依赖项来匹配此传播规则来使类型明确

(FH) H (a —> b),H (a' —> b) => a = a'

【问题讨论】:

    标签: haskell type-inference


    【解决方案1】:

    由于H是一个类型类名称,它可以接纳多个实例

    instance H (Int -> Bool) where
    instance H (Char -> Bool) where
    ...
    

    在这种情况下,如果我们有一个术语

    x :: ∀a,b. H(a → b) ⇒ b
    

    我们需要计算

    x && True
    

    我们需要对x :: Bool 进行类型检查,但这只能确定b = Bool,而a = Inta = Char 都可以使用。因此类型不明确。

    【讨论】:

    • 感谢您的回复。我意识到我的评论太大了,所以我编辑了原始帖子。我对 Haskell 还是新手,所以我无法在代码中重现你的答案。你能告诉我我哪里错了吗?
    • @jackmalkovick 您假设g 是类中的方法,但g 不一定是方法,AFAICU。您可以在类之外将g :: ∀a,b. H(a → b) ⇒ b 定义为g = undefined。 GHC 会抱怨类型不明确。即使您通过打开 GHC 扩展程序强制接受它,我认为g && True 也会触发错误。
    猜你喜欢
    • 1970-01-01
    • 2022-08-12
    • 1970-01-01
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多