Haskell 差异列表和点自由函数

Haskell difference lists and point free function

我正在研究差异列表并找到 DList 类型

newtype DList a = DL { unDL :: [a] -> [a] }

和函数

dlToList :: DList a -> [a]
dlToList = ($[]) . unDL

我想知道该函数的非点免费版本是什么,($[]) 有什么作用?

了解函数的无点定义的第一步是恢复 η 归约:

dlToList = ($[]) . unDL
dlToList dl = (($[]) . unDL) dl

然后开始应用到合成链,从右到左:

dlToList dl = ($[]) (unDL dl)

然后您可以解压运算符部分

dlToList dl = unDL dl $ []

然而,保持 ($[]) 实际上是有意义的,因为这是差异列表和普通列表之间的基本转换器:它需要一个 [a]->[a]-prepender-function 并将其应用于终止符 [],生成一个具体列表。


我们可以进一步简化:

dlToList dl = unDL dl []

顺便说一句,可以用更短的方式再次使其无积分:

dlToList = (`unDL`[])