D c where ..."?这个类型类声明的含义是什么?-6ren"> D c where ..."?这个类型类声明的含义是什么?-我试图理解以下类声明: class (MonadHold t (PushM t), MonadSample t (PullM t), Functor (Event t), Functor (Behav-6ren">
gpt4 book ai didi

haskell - 哪些语言扩展可以写入 "class A (B c) => D c where ..."?这个类型类声明的含义是什么?

转载 作者:行者123 更新时间:2023-12-04 23:19:37 25 4
gpt4 key购买 nike

我试图理解以下类声明:

class (MonadHold t (PushM t), MonadSample t (PullM t), Functor (Event t), Functor (Behavior t)) => Reflex t where
data Behavior t :: * -> *

这是在 Reflex玻璃钢库。

1 ) 哪些语言扩展可以编写 Functor (Behavior t) => Reflex t ?我猜它是语言扩展的组合。我猜类型家族也参与其中,但还有什么?

换句话说,我必须打开什么语言扩展,以便包含 class A (B c) => D c where ... 的代码编译?

2) class A (B c) => D c where ...是什么意思?

3 ) 你能举一个 super 简单的例子来解释为什么以及何时要写 class A (B c) => D c where ... ?

4 ) 哪里描述了什么 class A (B c) => D c where ...方法 ?我想有一篇 SPJ 论文或演讲描述了它,你能指点一下吗?

编辑:

更多相关信息:

Here这个已经写完了:

In Haskell 98 the context of a class declaration (which introduces superclasses) must be simple; that is, each predicate must consist of a class applied to type variables.



如果我正确解释了上述引文,那么只有在 Haskell98 中 class A b=>C b where形状类声明是允许的,这意味着 class A(B c) => D c不被允许。所以问题是,如果允许后者,而前者不允许,谁和什么定义了后者的含义?后者不是正确的 Haskell 98 语法,因此它的含义也没有在任何 Haskell 98 书中描述,那么后者描述/记录/指定的含义在哪里?

最佳答案

首先,正如您猜对的那样,Behaviourassociated data type ,所以属于 TypeFamilies延期。
class Functor (Behaviour t) => Reflex t where data Behaviour t :: * -> *点是强制要求对于任何类型 t这是 Reflex 的一个实例,无论您定义为关联数据类型的任何数据类型 Behaviour t ,您还必须将该类型设为 Functor 的实例.

这是一个小例子:假设我有这个类定义:

{-# LANGUAGE TypeFamilies, FlexibleContexts #-}

class Functor (F a) => Funky a where
data F a :: * -> *

这允许写类似的东西
frobulate :: (Funky a) => F a Int -> F a Bool
frobulate = fmap (< 5)

frobulate可以自由假设来自 Funky a那个 Functor (F a) .

以下内容本身被类型检查器拒绝:
instance Funky Int where
data F Int a = MkF a

因为关联的数据类型 F Int不是 Functor 的实例:
No instance for (Functor (F Int))
arising from the superclasses of an instance declaration
In the instance declaration for `Funky Int'

这迫使您还添加一个实例定义,如
instance Functor (F Int) where
fmap f (MkF x) = MkF (f x)

注意后者 Functor实例也需要 FlexibleInstances开启。

关于haskell - 哪些语言扩展可以写入 "class A (B c) => D c where ..."?这个类型类声明的含义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31261665/

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