gpt4 book ai didi

f# - F# 中是否可以柯里化(Currying)中间函数参数?

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

这是运行良好的代码:

let f x y z = x + y + z

let g x y = f x y
let h x z = z |> f x

所以我可以写表达式“h 1”,FSI 显示:

val it : (int -> int -> int) = <fun:it@110-3>

如果我调用“h 1 2 3”,参数将以正确的顺序应用。
但是如果最后一个参数有不同的类型,事情就会变得不同:

let ff x y (z : string) = x + y

let gg x y = ff x y
let hh x (z : string) = z |> ff x

现在最后一个函数 hh 会导致错误消息:

Script.fsx(119,10): error FS0001: Type mismatch. Expecting a string -> 'a but given a int -> string -> int. The type string does not match the type int

我明白为什么会发生这种情况 - “z”被附加到“ff x”,使其成为第二个参数。但我预计第一个示例表达式“h 1 2 3”不能正常工作(作为“f 1 3 2”执行)。但它工作得很好。

最佳答案

示例中的函数 ffgg 是相同的 - 管道操作符为右侧函数的第一个参数提供值。在您的示例中,右侧的函数是 ff x,并且通过使用管道操作符,您可以指定参数 y 的值:

let ff x y (z : string) = 
printfn "%s" z
x + y

// These two functions are the same:
let gg x y = ff x y
let hh x y = y |> ff x

使用部分函数应用程序时,没有用于指定第一个参数以外的标准语法。但是,您可以编写高阶函数或自定义运算符来执行此操作。例如:

// Takes a function 'f' of type 'b -> 'a -> 'c
// and a value 'v' of type 'a and creates a function
// that takes the first argument ('b -> 'c)
let (|*>) v f = (fun mid -> f mid v);;

let gg x y = ff x y // Specifies arguments x and y
let hh x z = z |*> ff x // Specifies arguments x and z

我将运算符命名为 |*> 以表示它会跳过一个参数。您可以定义类似地指定其他参数值的运算符(例如 |**> 跳过前两个参数)。

关于f# - F# 中是否可以柯里化(Currying)中间函数参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3194806/

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