【发布时间】:2016-03-09 05:49:49
【问题描述】:
好的,那么继续my previousquestions,我有一个类型叫Enumeration,它被描述为
现在,枚举是有限桶的无限序列, 自然数索引
并定义为:
> type Nat = Int
> type Enumeration a = Nat -> Finite a
这是Finite Bucket
> type Finite a = [a]
如果我理解正确,Enumeration 类似于列表列表?它是一个从 Int 到列表的函数,它应该像索引一样接受一个 int,并返回一个列表。
但我无法理解的是,如果它确实是一个列表列表,它将“列表”存储在哪里,以便以后可以使用我提供的 index 返回它们。
我已经在 Enumeration 类型上定义了一些函数,但我不确定它们是否正确,因为我不确定我是否理解 Enumeration 的真正含义。
例如:
定义一个函数来进行单例枚举。 为简单起见,我建议您将唯一的项目放入存储桶 0。
> singleE' :: a -> Enumeration a
> singleE' a 0 = singleF a
定义枚举映射:
> imapE :: (a -> b) -> Enumeration a -> Enumeration b
> imapE f g = (imapF f) . g
定义不相交的枚举联合:
为简单起见,您可以逐桶进行此操作:结果枚举的第 i 个桶中的项目应从第 i 个桶中提取 两个参数枚举。
> plusE :: Enumeration a -> Enumeration b -> Enumeration (Either a b)
> plusE f g = \n -> [Left x | x <- f n] ++ [Right y | y <- g n]
定义枚举的笛卡尔积
这比较棘手,因为你不能再逐桶进行了, 就像你对 plusE 所做的那样(为什么不呢?)。最简单的技术是执行 一种卷积:结果枚举的桶 i 中的项目 应该从第一个参数的桶 j 中的那些构造 并在第二个桶 k 中,其中 j + k = i。
> timesE :: Enumeration a -> Enumeration b -> Enumeration (a,b)
> timesE f g = \n -> timesF (f n) (g n)
所以我的问题是:
我是否正确理解
Enumeration的类型如果我这样做了,我定义的函数是否正确?
【问题讨论】:
-
也许您至少应该链接到您之前的问题(this one 对吗?) - 但取决于您的
imapF和singleF是否正确,这似乎没问题 - 也许您可以争论您想为singleE'中的其他整数返回空桶(不使其成为部分),但这可能取决于您在此处的规格 -
你说的正确是什么意思?你说的很有意义,函数类型检查和一切,所以我会说 这里没有错。但是要讨论它是否正确,您需要指定您实际想要实现的目标。 — 我已经说过,这种容器在许多情况下会表现出低于标准的性能,但对于某些应用程序来说,它可能会做得很好。
-
@Carsten @leftaroundabout 我已经更新了问题,加上我在 plusE 上的说明,以及另一个名为 timesE 的函数,因为这些说明我觉得我不明白 @ 的类型987654340@ 正确。
-
@leftaroundabout, @EliBraginskiy 我感觉无论是谁在做这些练习,都在试图建立一些建设性的证明,证明总和类型和乘积类型保持可枚举性/可数性,例如从自然数的枚举证明你可以枚举有理数。这可能就是为什么你有
k + j = i(有理数的经典计数方法)。
标签: haskell types functional-programming