元组函数组合

发布于 2024-12-04 08:56:00 字数 262 浏览 1 评论 0原文

我很好奇为什么

let f = (fun a b -> a, b) >> obj.Equals

会出现这个错误

没有名为“Equals”的可访问成员或对象构造函数接受 1 个参数

但这有效

let f = (fun a -> a, a) >> obj.Equals

I'm curious why this

let f = (fun a b -> a, b) >> obj.Equals

gives the error

No accessible member or object constructor named 'Equals' takes 1 arguments

but this works

let f = (fun a -> a, a) >> obj.Equals

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

草莓味的萝莉 2024-12-11 08:56:00

不定义新的组合运算符:

let f = (fun a b -> a, b) >> (<<) obj.Equals

>> (<<) 是一个很好的技巧,也可以扩展为更多参数:

let compose3 f g = f >> (<<) ((<<) g)
val compose3 : ('a -> 'b -> 'c -> 'd) -> ('d -> 'e) -> ('a -> 'b -> 'c -> 'e)

Without defining a new combinator operator:

let f = (fun a b -> a, b) >> (<<) obj.Equals

>> (<<) is a nice trick, and can also be extended for more arguments:

let compose3 f g = f >> (<<) ((<<) g)
val compose3 : ('a -> 'b -> 'c -> 'd) -> ('d -> 'e) -> ('a -> 'b -> 'c -> 'e)
甚是思念 2024-12-11 08:56:00

考虑类型。 (>>) 的类型为 ('a -> 'b) ->('b -> 'c) ->; ('a -> 'c),但您尝试使用 'a ->; 类型的参数调用它('b -> 'a*'b)obj * obj -> bool,它不能像这样组合在一起。

您当然可以定义一个新的组合器来组合二元和一元函数:

let ( >>* ) f g a b = f a b |> g

在这种情况下,您可以在示例中使用它而不是 (>>)

Consider the types. (>>) has type ('a -> 'b) ->('b -> 'c) -> ('a -> 'c), but you're trying to call it with arguments of type 'a -> ('b -> 'a*'b) and obj * obj -> bool, which can't be made to fit together like that.

You could of course define a new combinator for composing binary and unary functions:

let ( >>* ) f g a b = f a b |> g

in which case you can use it in your example instead of (>>).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文