首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在F#中是否有可能修改一个中间函数的参数?

在F#中是否有可能修改一个中间函数的参数?
EN

Stack Overflow用户
提问于 2010-07-07 12:54:58
回答 1查看 1.2K关注 0票数 8

下面的代码工作得很好:

代码语言:javascript
复制
let f x y z = x + y + z

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

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

代码语言:javascript
复制
val it : (int -> int -> int) = <fun:it@110-3>

如果我调用“h1-2 3",则参数将按正确的顺序应用。

但是,如果最后一个论点有不同的类型,情况就会不同:

代码语言:javascript
复制
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):错误FS0001:类型不匹配。期待一个string -> 'a,但被赋予一个int -> string -> int。类型stringint类型不匹配。

我理解为什么会发生这种情况- "z“被附加到"ff x”之后,使它成为第二个参数。但是,我希望在第一个示例表达式“h1-2 3”中不能正常工作(以“f1 3 2”的形式执行)。但效果很好。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-07-07 13:24:11

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

代码语言:javascript
复制
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

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

代码语言:javascript
复制
// 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

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

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3194806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档