gpt4 book ai didi

Haskell 种类和类型约束

转载 作者:行者123 更新时间:2023-12-02 04:43:48 25 4
gpt4 key购买 nike

假设我有以下类型类

class Silly (t :: * -> *) where
-- details

我希望能够表达以下约束,但我不确定是否可行。

class (Silly s) => Willy (s t) where
-- details

基本上我想对类型构造函数施加约束,而不是整个类型。这甚至可以表达吗?我什至不确定这种约束会被称为什么,所以谷歌没有帮助。

编辑:我有一个数据类型

data Reasoner logic atoms a = Reasoner { unReasoner :: MassAssignment atoms -> a }

有一个 Applicative 实例。我最初有一个 run 函数,以便更轻松地使用这些 Reasoner,但由于我想利用应用程序的自由组合性,我定义了一个包含 run< 的类型类 相反,ala

class RunReasoner r where
type MassType r
type ResultType r
run :: r -> MassType r -> ResultType r

具有以下实例

instance RunReasoner (Reasoner l as a) where
type MassType (Reasoner l as a) = MassAssignment as
type ResultType (Reasoner l as a) = a
run = -- details

instance (RunReasoner (r2 t)) => RunReasoner (Compose (Reasoner l1 as1) r2 t) where
type MassType (Compose (Reasoner l1 as1) r2 t) = MassAssignment as1
type ResultType (Compose (Reasoner l1 as1) r2 t) = r2 t
run = -- details

这样我就可以写出这样的代码

expression `run` mass1 `run` mass2 `run` ... `run` massN

这在大多数情况下都很好,但我现在正在以其他方式编写推理器,并且希望 MassType 仅从类型构造函数 Reasoner l as 中可用,而不是必须具有完整类型实例 Reasoner l as a。因此,我正在考虑将 RunReasoner 类型类拆分为两个,因为 MassType 不依赖于最终类型参数。

最佳答案

你可以做一个独立的类型族

type family MassType (r :: * -> *)
type instance MassType (Reasoner l as) = as

关于Haskell 种类和类型约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20226902/

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