java enum 关联_枚举类型类中的关联类型

给定类似于以下的类型类定义,我想枚举 MyClassId a 类型作为 MyClass 实例的任何类型 .

{-# LANGUAGE TypeFamilies #-}

{-# LANGUAGE FlexibleContexts #-}

class

( Enum (MyClassId e)

, Bounded (MyClassId e))

=> MyClass e where

type MyClassId e :: *

enumMyClassId :: MyClass a => [MyClassId a]

enumMyClassId = enumFrom minBound

但是,当我尝试编译这段代码时,GHC 7.10.2会抱怨以下消息:

enumTypeClass.hs:12:18:

Couldn't match type ‘MyClassId a0’ with ‘MyClassId a’

NB: ‘MyClassId’ is a type function, and may not be injective

The type variable ‘a0’ is ambiguous

Expected type: [MyClassId a]

Actual type: [MyClassId a0]

In the ambiguity check for the type signature for ‘enumMyClassId’:

enumMyClassId :: forall a. MyClass a => [MyClassId a]

To defer the ambiguity check to use sites, enable AllowAmbiguousTypes

In the type signature for ‘enumMyClassId’:

enumMyClassId :: MyClass a => [MyClassId a]

我不确定为什么它不能推断 a 类型变量与函数 enumMyClassId 的约束中的 a 相同 . 一种可能的解决方法是将函数 enumMyClassId 更改为以下内容:

enumMyClassId :: MyClass a => a -> [MyClassId a]

enumMyClassId _ = enumFrom minBound

但这并不是很优雅,因为它引入了一个未使用的变量,只是为了使程序检查 . 是否有一些解决方案不涉及上述技巧?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值