是否存在类型对齐序列的应用类似物?

时间:2016-05-20 17:32:47

标签: haskell types gadt

类型对齐序列是索引类型的序列,其索引必须首尾相连。最简单的例子是

data TList c x z where
  TNil :: TList c x x
  TCons :: c x y -> TList c y z -> TList c x z

一般来说,没有合理的方式**&#34; zip&#34;两个TList在一起,但我猜测可能有某种方式表达类似笛卡尔积的操作,如<*> []。一般的想法是在每个&#34;行&#34;的末尾链接索引。在下一个开始的那个。但我在弄清楚如何做到这一点时遇到了麻烦。如果我能弄清楚如何编写类型对齐的手指树的实现,类似于Data.Sequence中的超极性手指树,那将会特别酷。

**这可以使用类型()的索引和适当的假设,但对于大多数类型,这必须在所有四个索引中采用完全多态的函数并返回存在的东西。没那么有用。

1 个答案:

答案 0 :(得分:2)

我们当然可以做的是

$res=mysqli_query("SELECT file FROM tbl_uploads WHERE id=".$_GET['remove_id']);
$row=mysqli_fetch_array($res);
mysqli_query("DELETE FROM tbl_uploads WHERE id=".$_GET['remove_id']);
unlink("uploads/".$row['file']);

(我假设显而易见的tlConcat :: TList (TList c) x z -> TList c x z tlConcat TNil = id tlConcat (TCons f l) = f >>> tlConcat l 个实例来“加盖”那些箭头链。)

如果我们将其与Category类似物

结合起来
map

我们基本上有一个monad。

对于tlMap :: (∀ a b . c a b -> d a b) -> TList c x y -> TList d x y tlMap _ TNil = TNil tlMap t (TCons f l) = TCons (t f) tlMap t l 样式的应用程序,我们不知何故需要包含该多态性:

<*>

然后,

data CaFun c d a b where
  CaFun :: (∀ α β . c α β -> d α β) -> CaFun c d x x

当然这有点无聊:tlAp :: TList (CaFun c d) x y -> TList c x x -> TList d x x tlAp _ TNil = TNil tlAp TNil _ = TNil tlAp (TCons (CaFun f) l) q = tlMap f q >>> tlAp l q 通过强制类型相等基本上颠覆了整个类型对齐点。可能还有更好的方法。

这里有类似拉链的东西:

CaFun

你注意到这只适用于等长列表,但我们可以很好地修复它:

tlLiftA2 :: (∀ α β γ δ . c α β -> d γ δ -> e (α,γ) (β,δ))
          -> TList c φ ψ -> TList d χ ω -> TList e (φ,χ) (ψ,ω)
tlLiftA2 _ TNil TNil = TNil
tlLiftA2 q (TCons f l) (TCons g m) = TCons (q f g) (tlLiftA2 q l m)