gpt4 book ai didi

haskell - 函数参数似乎在类型分析中消失了

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

我正在尝试通过使用类型类来使函数通用,但我一直遇到这个错误:

我有一个数据类型:

data ValeurM m = VLitteralM Litteral
| VFonctionM (ValeurM m -> m (ValeurM m))

表示函数或文字值, m是 Monad 类型

我还有一个注入(inject)器类来将值注入(inject)这种类型

class Injectable m t where
injecte :: t -> ValeurM m

instance Injectable m Bool where
injecte = VLitteralM . Bool

instance Injectable m Integer where
injecte = VLitteralM . Entier

然后我尝试以通用方式制作 ifthenelse 函数,如下所示:

injIf :: (Fail.MonadFail m) => (Bool -> ValeurM m -> ValeurM m -> ValeurM m) -> ValeurM m
injIf = injecte

ifM :: (Fail.MonadFail m) => Bool -> ValeurM m -> ValeurM m -> ValeurM m
ifM bool iss1 iss2 = if bool then iss1
else iss2

ifthenelseM :: (Fail.MonadFail m) => ValeurM m
ifthenelseM = injIf ifM

但是,我收到此错误消息:

Interprete.hs:595:9: error:
• Could not deduce (Injectable
m (ValeurM m -> ValeurM m -> ValeurM m))
arising from a use of ‘injecte’
(maybe you haven't applied a function to enough arguments?)
from the context: Fail.MonadFail m
bound by the type signature for:
injIf :: forall (m :: * -> *).
Fail.MonadFail m =>
(Bool -> ValeurM m -> ValeurM m -> ValeurM m) -> ValeurM m
at Interprete.hs:594:1-89
• In the expression: injecte
In an equation for ‘injIf’: injIf = injecte
|
595 | injIf = injecte
| ^^^^^^^

它应该类似于 Normalisation by evaluation ,但我似乎无法让它工作

困扰我的是错误消息似乎没有考虑到第一个 Bool 参数,我错过了什么吗?

编译失败

最佳答案

这个实例

instance (Monad m, Injectable m t) => Injectable m ((Bool -> ValeurM m -> ValeurM m -> ValeurM m) -> t) where
injecte = injecte

不是你想要的。确实,它为您提供:
injecte :: ((Bool -> ValeurM m -> ValeurM m -> ValeurM m) -> t) -> ValeurM m

但你想要
injIf :: (Bool -> ValeurM m -> ValeurM m -> ValeurM m) -> ValeurM m

所以改为 Bool -> t启动的实例。

您可能需要一个实例
instance {-# OVERLAPPING #-} (_TODO_)
=> Injectable m (Bool -> ValeurM m -> ValeurM m -> ValeurM m) where

Injectable m (Bool -> t) 重叠这就是我添加 {-# OVERLAPPING #-} 的原因注解。

或者,也许您想要不同的实例组合,它可以与 Injectable m (Bool -> t) 结合使用。实例
instance Injectable m t => Injectable m (ValeurM m -> t) where
instance Injectable m (ValeurM m) where -- base case

实际上,这似乎是一个更好的解决方案。这是这两个实例的实现;有了这个,我可以编译你的代码:
instance (Monad m, Injectable m t) => Injectable m (ValeurM m -> t) where
injecte f = VFonctionM (\v -> pure (injecte (f v)))

instance (Monad m) => Injectable m (ValeurM m) where
injecte = id

关于haskell - 函数参数似乎在类型分析中消失了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60905442/

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