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`[])
我正在研究差异列表并找到 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`[])