gpt4 book ai didi

Haskell - 让绑定(bind)选择错误的实例

转载 作者:行者123 更新时间:2023-12-02 12:14:10 24 4
gpt4 key购买 nike

下面的测试让我大吃一惊

{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE UndecidableInstances #-}
module Test where

class Type t where
encodeToField :: t -> String

class Rec r where
encodeToRec :: r -> String

data X a b = X a b

instance (Type t) => Rec t where
encodeToRec = encodeToField

instance (Type t, Rec r) => Rec (X t r) where
encodeToRec (X t r) =
let x = encodeToField t
y = encodeToRec r
in x ++ y

ghc 失败了

Test.hs:19:17
Could not deduce (Type r) arising from a use of `encodeToRec'
from the context (Type t, Rec r)

出于某种原因,ghc 希望在 y =encodeToRec r 处使用 Type t => Rec t 实例,而不是仅仅采用 Rec r code> 来自实例声明的上下文。

如果我避免使用 let 绑定(bind)并改为写入

instance (Type t, Rec r) => Rec (X t r) where
encodeToRec (X t r) = encodeToRec t ++ encodeToRec r

编译成功。

这是 ghc 中的错误还是由于使用的语言扩展而应该出现这种行为?

最佳答案

这闻起来很像 known bug :当我删除通用实例时,您的代码会编译,但 GHC 找不到它所提供的约束。我有一个相应的SO问题here 。如果这是同一个错误,它可能会暂时无法修复(如果有的话)。

关于Haskell - 让绑定(bind)选择错误的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31256154/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com