教会编码的实际原因

Rot*_*sor 14 haskell church-encoding

教会编码(又名访客模式)是一种将数据表示为函数的方式:而不是

data T = C1 F1 F2 | C2 F3 F4
Run Code Online (Sandbox Code Playgroud)

你可以定义

data T = T (forall r. (F1 -> F2 -> r) -> (F3 -> F4 -> r) -> r)
Run Code Online (Sandbox Code Playgroud)

.虽然将任何东西表示为函数的能力很好,但我一直认为第一个版本更可取,因为它更清晰,并且不需要语言扩展(显式forall).但是,您有时可以在公共图书馆中找到教会编码的数据.使用它有什么好处?

公共图书馆中教会编码的例子:

ehi*_*ird 10

这对应于具有多个延续的连续传递样式,并且是为了性能而完成的:避免了数据的显式构造和销毁,而是直接基于模式匹配的输出直接传递控制,而不是立即完成.这并不总是能够提高性能,但是当它发挥作用时,它可能相当重要.

基本上,您可以将其视为数据与控制.如果你所做的事情本质上与控制本质上相似 - 例如解析器的成功和失败分支 - 那么基于控件的表示可能会更好.否则,坚持使用数据.