gpt4 book ai didi

f# - 管道运算符(operator)为什么工作?

转载 作者:行者123 更新时间:2023-12-03 23:58:06 24 4
gpt4 key购买 nike

如果管道操作符是这样创建的:

let (|>) f g = g f

并像这样使用:
let result = [2;4;6] |> List.map (fun x -> x * x * x)

然后它似乎要做的是将 List.Map 放在后面 (fun x -> x * x * x)
并且不会改变 [2;4;6] 的位置

所以现在它看起来像这样:
let result2 = [2;4;6] (fun x -> x * x * x) List.map

然而这行不通。

我现在只是第一次学习 f#。这让我在阅读有关 f# 的书时感到困扰。所以我以后可能会知道我错过了什么,但我还是决定问一下。

很明显,我遗漏了一些重要的东西。因为我可以轻松地重新创建管道运算符。但我不明白它为什么有效。当我了解更多时,我可能很快就会让自己难堪。那好吧。

最佳答案

管道运算符只是链式方法调用的语法糖。它与 C# 中 linq 表达式的表达方式非常相似。

来自 here 的解释:

前进管道运算符(operator)
我喜欢这个人。 Forward 管道运算符简单定义为:

let (|>) x f = f x

并有一个类型签名:
'a -> ('a -> 'b) -> 'b

这意味着:给定一个泛型类型 'a,以及一个接受 'a 并返回一个 'b 的函数,然后返回该函数在输入上的应用。

与其解释这一点,不如让我举一个可以使用它的示例:
// Take a number, square it, then convert it to a string, then reverse that string
let square x = x * x
let toStr (x : int) = x.ToString()
let rev (x : string) = new String(Array.rev (x.ToCharArray()))

// 512 -> 1024 -> "1024" -> "4201"
let result = rev (toStr (square 512))

代码非常简单,但请注意语法看起来有多么不守规矩。我们要做的就是获取一次计算的结果并将其传递给下一次计算。我们可以通过引入一系列新变量来重写它:
let step1 = square 512
let step2 = toStr step1
let step3 = rev step2
let result = step3

但是现在您需要保持所有这些临时变量的完整性。 (|>) 运算符的作用是取一个值,然后将它“转发”给一个函数,本质上允许您在函数调用之前指定函数的参数。这允许您将函数通过管道连接在一起,其中一个的结果被传递到下一个,从而极大地简化了 F# 代码。因此,要使用相同的示例,代码可以清楚地写为:
let result = 512 |> square |> toStr |> rev

编辑 :

在 F# 中,您真正使用方法调用所做的是获取一个函数,然后将其应用于后面的参数,因此在您的示例中,它将是 List.map (fun x -> x * x * x)适用于 [2;4;6] .管道操作符所做的就是以相反的顺序获取参数,然后让应用程序将它们反转回来。

功能: List.map (fun x -> x * x * x)参数: [2;4;6]
标准 F# 调用语法:f g

反转 F# 调用语法:g f

标准:
let var = List.map (fun x -> x * x * x) [2;4;6]

反转:
let var = [2;4;6] |> List.map (fun x -> x * x * x)

关于f# - 管道运算符(operator)为什么工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12921197/

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