gpt4 book ai didi

Haskell 无法从上下文错误中推断出 ...

转载 作者:行者123 更新时间:2023-12-03 15:09:07 24 4
gpt4 key购买 nike

我有类型类,我希望对所有这些类都有一些共同的行为。下面的代码解释了我的问题:

A类
B类

类别 X x 其中
方法::(A a, B b) => x -> a -> b

数据 T = L |中号 | ñ
数据 U = P |问 | R

实例 A T
实例 B U

数据 Y = ZZZ

实例 X Y 其中
方法_L = P
方法_M = Q
方法_N = R

加载此模块时,出现以下错误:

示例.hs:19:14:
无法推断 (a ~ T)
从上下文(A a,B b)
由方法::(A a, B b) => Y -> a -> b 的类型签名绑定(bind)
在 example.hs:(17,5)-(19,18)
`a' 是一个刚性类型变量,由
方法::(A a, B b) => Y -> a -> b 的类型签名
在 example.hs:17:5
模式中:N
在“方法”的等式中:方法_N = R
在“X Y”的实例声明中

示例.hs:19:18:
无法推断 (b ~ U)
从上下文(A a,B b)
由方法::(A a, B b) => Y -> a -> b 的类型签名绑定(bind)
在 example.hs:(17,5)-(19,18)
`b' 是一个刚性类型变量,由
方法::(A a, B b) => Y -> a -> b 的类型签名
在 example.hs:17:5
在表达式中:R
在“方法”的等式中:方法_N = R
在“X Y”的实例声明中
失败,加载模块:无。

在这种情况下,我不知所措。即使 T 和 U 是 A 和 B 的实例,我也会收到此错误。如果我不能从 method 返回一个刚性类型值,我如何编码这部分?

最佳答案

签名method :: (A a, B b) => x -> a -> b promise method 工作每对类型 (a, b)a A 的一个实例和 b B 的一个实例,但您将其定义为仅适用于两种特定类型。

这与 Java 等中的接口(interface)根本不同,其中被调用者选择使用哪种类型,调用者唯一知道的是接口(interface) X 已实现。在 Haskell 中,给定这样的签名,调用者决定使用哪些类型(这里,作为第二个参数传递什么类型以及应该返回什么类型)并且被调用者必须能够提供所需的功能(只要需要类型是所需类的实例)。

类中没有任何方法 AB要分别分析该类实例的构造值,您无法实现 method除了 undefined (由于 seq 可能存在不同程度的不确定性),因此您必须告诉全世界您实际上正在使用 TU .

另一种方法是制作 X多参数类型类,

{-# LANGUAGE MultiParamTypeClasses #-}

class (A a, B b) => X x a b where
method :: x -> a -> b

但是,这可能需要功能依赖关系来解析实例。另一种方法是使用关联类型,
{-# LANGUAGE TypeFamilies #-}

class X x where
type AType x
type BType x
method :: x -> AType x -> BType x

instance X Y where
type AType Y = T
type BType Y = U
method ...

关于Haskell 无法从上下文错误中推断出 ...,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9353318/

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