类型对齐序列是索引类型的序列,其索引必须首尾相连。最简单的例子是
data TList c x z where
TNil :: TList c x x
TCons :: c x y -> TList c y z -> TList c x z
一般来说,没有合理的方式**" zip"两个TList
在一起,但我猜测可能有某种方式表达类似笛卡尔积的操作,如<*>
[]
。一般的想法是在每个&#34;行&#34;的末尾链接索引。在下一个开始的那个。但我在弄清楚如何做到这一点时遇到了麻烦。如果我能弄清楚如何编写类型对齐的手指树的实现,类似于Data.Sequence
中的超极性手指树,那将会特别酷。
**这可以使用类型()
的索引和适当的假设,但对于大多数类型,这必须在所有四个索引中采用完全多态的函数并返回存在的东西。没那么有用。
答案 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)