gpt4 book ai didi

for-loop - For 循环构造转为函数式

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

我目前正在学习 Racket 并想完成以下简单任务:构造一个包含所有元组的列表 (i,j) : Int * Int0 <= i < N0 <= j < M .

在 Python 中,我会立即知道如何通过使用 for 循环来解决这个问题:

# Not using any modules on purpose here
a = []
for i in range(5):
for j in range(6):
a.append((i,j))

但是我在 Racket 中做这件事时遇到了麻烦。到目前为止,我已经找到了一个解决方案,它通过使用递归定义的函数来复制 for 循环方法,该函数为 a : Af : Int -> A -> A满足方程

for 0 a f = (f 0) a
for n a f = for (n-1) ( (f n) a ) f

这导致应用程序链:for n a f = ( (f 0) ∘ ... ∘ (f n) )(a) . (f ∘ g 我的意思是 fg 的组合)。所以先f n适用于 a , 然后 f (n - 1)结果等等。

鉴于我基本上想做类似 ((f 0 0) ∘ (f 0 1) ∘ ... ∘ (f N M)) (a) 的事情,它可以拆分为:

 (((f 0 0) ... (f 0 M)) ∘ ... ∘ ((f N 0) ... (f N M))) (a)
= ((λz. for M z (f 0)) ∘ ... ∘ (λz. for M z (f N))) (a)
= for N a (λi z. for M z (f i))

然后转换为以下 Racket 代码:

(define (for n a f)   ;; (for n '() cons) = range(n) = (0 1 ... n-1)
(if (< 0 n)
(for (- n 1) (f (- n 1) a) f)
a))

(define a '())
(define (append i j x) (cons (cons i j) x))

(for 5 a (λ(i x)
(for 6 x (λ(j y)
(append i j y)))))

答案产生了预期的结果,并且至少很好,因为很明显如何使用任意数量的附加循环来扩展此构造。

但我仍然想知道是否有更简洁的功能方法来做到这一点。

我对任何使用或不使用函数的答案都很满意,这些函数可能已经存在于某些库中,而我到目前为止只是错过了这些函数。

最佳答案

您可能正在寻找 for*/list :

(for*/list ([i (range 5)]
[j (range 6)])
(list i j))

另见 Racket 指南 Iterations and Comprehensions .

关于for-loop - For 循环构造转为函数式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71091980/

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