gpt4 book ai didi

f# - 使用正确的副作用顺序在 OCaml/F# 中重新实现 List.map?

转载 作者:行者123 更新时间:2023-12-04 13:25:47 25 4
gpt4 key购买 nike

根据this previous answer

你可以实现 List.map像这样:

let rec map project = function
| [] -> []
| head :: tail ->
project head :: map project tail ;;

但相反,它是这样实现的:
let rec map project = function
| [] -> []
| head :: tail ->
let result = project head in
result :: map project tail ;;

他们说这样做是为了确保以预期的顺序调用投影函数,以防它有副作用,例如
map print_int [1;2;3] ;;

应该打印 123 ,但第一个实现将打印 321 .但是,当我自己在 OCaml 和 F# 中测试它们时,它们会产生完全相同的 123结果。

(请注意,我正在 OCaml 和 F# REPL 中对此进行测试——评论中的尼克暗示这可能是我无法重现的原因,但为什么呢?)

我有什么误解?有人可以详细说明为什么他们应该产生不同的订单以及我如何重现?这与我之前对过去编写的 OCaml 代码的理解背道而驰,所以这让我感到惊讶,我想确保不要重复这个错误。当我阅读两者时,我将其视为完全相同的内容,并带有无关的中介绑定(bind)。

我唯一的猜测是使用 cons 的表达式评估顺序是从右到左,但这似乎很奇怪?

这纯粹是为了更好地了解 OCaml 如何执行代码而进行的研究,我真的不需要创建自己的 List.map用于生产代码。

最佳答案

所以当你有 map 的实现时像这样:

let rec map f = function
| [] -> []
| a::l -> f a :: map f l
f a 中没有任何功能应用程序 ( map)保证按照您期望的顺序依次评估调用。所以当你尝试这个时:
map print_int [1;2;3]

你得到输出
321- : unit list = [(); (); ()]

因为到那时这些功能应用程序还没有按特定顺序执行。

现在当你实现 map像这样:
let rec map f = function
| [] -> []
| a::l -> let r = f a in r :: map f l

您正在强制功能应用程序按照您期望的顺序执行,因为您明确调用了评估 let r = f a .

所以现在当你尝试:
map print_int [1;2;3]

你会得到
123- : unit list = [(); (); ()]

因为您已明确努力按顺序评估功能应用程序。

关于f# - 使用正确的副作用顺序在 OCaml/F# 中重新实现 List.map?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43882340/

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