一对函数的数据类型?

乔尔

我有一个数据类型,它是一对可链接的函数。在伊德里斯这是

data Foo i o = MkFoo (i -> ty) (ty -> o)

我希望这在 Haskell 中意味着什么是相当明显的。这是一个广泛使用的构造,也许有名字?

Iceland_jack

你想ty成为一个存在类型吗?

type Foo :: Cat Type
data Foo i o where
 MkFoo :: (i -> ty) -> (ty -> o) -> Foo i o
                ^^      ^^
                |       |
             does not appear in the result type

Data.Profunctor.Composition

type Pro :: Type
type Pro = Type -> Type -> Type

type Procompose :: Pro -> Pro -> Pro
data Procompose pro2 pro1 іn out where
  Procompose :: pro2 xx out -> pro1 іn xx -> Procompose pro2 pro1 іn out

Foo可以在以下方面进行定义

type Foo :: Cat Type
type Foo = Procompose (->) (->)

                 we quantify `ty` here because it's existential
                                      |
                                      vvvvvvvvv
pattern MkFoo :: forall іn out. () => forall ty. (іn -> ty) -> (ty -> out) -> Foo іn out
pattern MkFoo one two = Procompose two one

还有一个自由类的概念是一个类型对齐的列表;即可链接函数列表

type (~>) :: Cat (k -> Type)
type f ~> g = (forall x. f x -> g x)

type Quiver :: Type -> Type
type Quiver ob = ob -> ob -> Type

type Cat :: Type -> Type
type Cat ob = Quiver ob

infixr 5 :>>>

type FreeCategory :: Quiver ~> Cat
data FreeCategory cat a b where
 Id     :: FreeCategory cat a a
 (:>>>) :: cat a b -> FreeCategory cat b c -> FreeCategory cat a c

可以写成长度为 2 的类型对齐列表:

type Foo :: Cat Type
type Foo = FreeCategory (->)

                 we quantify `ty` here because it's existential
                                      |
                                      vvvvvvvvv
pattern MkFoo :: forall іn out. () => forall ty. (іn -> ty) -> (ty -> out) -> Foo іn out
pattern MkFoo one two = one :>>> two :>>> Id

自由类别也可以定义为Free2 Category通过将Category传递Free2.. 有点漫不经心的答案

type (~~>) :: Cat (k1 -> k2 -> Type)
type f ~~> g = (forall x. f x ~> g x)

type Free2 :: (Cat ob -> Constraint) -> Quiver ob -> Cat ob
type Free2 cls cat a b = (forall xx. cls xx => (cat ~~> xx) -> xx a b)

type FreeCategory :: Quiver ~> Cat
type FreeCategory cat a b = Free2 Category cat a b

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Coq 数据类型 - 一对带括号的对

ruby中哈希数据类型中的“默认值是同一对象”

重构一个返回不同数据类型的函数

多态数据类型的函数

在其构造函数之一中创建Haskell数据类型以接受非*类型的类型

在函数中添加数据类型

Haskell-数据类型函数

Julia:函数的偶数数据类型

具有数据类型的函数

定义数据类型包括约束函数

SML从数据类型调用函数

用户定义函数的无效数据类型

Javascript函数派生“最小”数据类型?

混合类型数据类型的距离函数类型是什么?

我可以编写一个可以在C中返回一种数据类型或另一种数据类型的函数吗?

C:数据类型。sqrt函数与int一起工作的原因是什么?

C将多种数据类型传递给同一函数

如何在Haskell中将fold函数与其他数据类型一起使用

函数唯一性更改R中data.frame中列的数据类型

Java,如何从一个函数输入中读取多种数据类型?

您可以使一个函数接受两种不同的数据类型吗?

函数中设置的数组值仅适用于一种数据类型

如何定义返回多种数据类型之一的函数?

是否可以在Haskell中创建一个函数,该函数返回数据类型的构造函数列表?

数据类型的未绑定类型构造函数

什么是函数的数据类型:函数或对象?在JavaScript中

模板函数参数的默认值的数据类型与实例化数据类型不同

是否可以定义存储与参数相同数据类型的lambda函数的数据类型?

在Haskell中,如何将函数限制为仅一种数据类型的构造函数?