gpt4 book ai didi

haskell - 连接编程语言中的偏函数应用

转载 作者:行者123 更新时间:2023-12-05 05:11:02 24 4
gpt4 key购买 nike

假设我有一个 haskell 函数 f n l = filter (n<) l它需要一个整数 n并列出 l并返回 l 中的所有整数大于n .

我正在尝试弄清楚如何用 Joy 这样的语言最好地编写此函数。我通常很幸运将 haskell 函数转换为 pointfree 形式 f = filter . (<)然后尝试从那里用 Joy 重写它。但是我想不出如何在连接语言中模拟部分函数应用。

到目前为止,我已尝试执行类似 swap [[>] dip] filter 的操作,但似乎必须有更好/更清晰的方式来编写它。

此外,我正在尝试编写自己的连接语言,并且想知道惰性求值是否可以与连接语言兼容。

最佳答案

swap [[>] dip] filter不会工作,因为它假定 n每次调用您过滤的报价时都可以访问;这意味着 filter运行时不能在栈上留下任何中间值,>不消耗 n .您需要捕获 n 的值在那句话中。

首先“eta”——减少列表参数:

l n f = l [ n > ] filter
n f = [ n > ] filter

然后捕获n通过显式引用它并用 > 组合它:

n f = n quote [ > ] compose filter

(假设 quote : a -> (-> a) a.k.a. unit 获取一个值并将其包装在引号中,compose : (A -> B) (B -> C) -> (A -> C) a.k.a. cat 连接两个引号。)

然后只是“eta”-reduce n :

f = quote [ > ] compose filter

我将“eta”用引号括起来,因为它比 lambda 演算更通用一些,适用于堆栈中的任意数量的值,而不仅仅是一个。

您当然可以将部分应用分解为自己的定义,例如papply Cat 中的组合子,已定义为 swons ( swap cons ) 在 Joy 中,但也可以这样定义:

DEFINE

papply (* x [F] -- [x F] *)
== [unit] dip concat ;

f (* xs n -- xs[>=n] *)
== [>] papply filter .

在 Kitten 中,这可以根据偏好以几种不同的方式编写:

// Point-free
function \> compose filter

// Local variable and postfix
-> n; { n (>) } filter

// Local variable and operator section
-> n; \(n <) filter

任何与函数式编程兼容的评估策略也与连接式编程兼容— popr是惰性拼接语言。

关于haskell - 连接编程语言中的偏函数应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55960860/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com