【问题标题】:Tupled function composition元组函数组合
【发布时间】:2011-09-12 22:12:13
【问题描述】:

我很好奇为什么会这样

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

给出错误

名为 'Equals' 的可访问成员或对象构造函数不接受 1 个参数

但是这行得通

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

【问题讨论】:

  • 我在尝试时收到的错误消息是此表达式的类型应为a -> 'b * 'a,但这里的类型为'c * 'd,这提供了更多信息。它更清楚地对应于 kvb 在他的好答案中所写的内容。我不确定您为什么收到不同的消息...

标签: f# function-composition


【解决方案1】:

不定义新的组合运算符:

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

&gt;&gt; (&lt;&lt;) 是一个不错的技巧,也可以扩展为更多参数:

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 啊。我忽略了&gt;&gt; 的第一个参数是一元的。那个奇怪的错误信息(我仍然收到)让我失望。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多