【问题标题】:How to cleanly hand parameters from function to function (like composition)如何干净地将参数从函数传递到函数(如组合)
【发布时间】:2012-08-18 01:22:42
【问题描述】:
let myFunc x y =
    List.fold (&&) true [func1 x y; func2 x y]

我不知道 F# 中所有不同的运算符和技术,但我希望我可以用一些运算符代替 func1 和 func2 的“xy”,以向他们指示“只需获取我的参数”,就像如何组合一样有隐式参数传递。

或者,如果有人能想出一种更直接、更简洁的方法来消除我的函数传递参数的需要,请告诉我。

另外,如果这似乎完全不可能,请告诉我。

谢谢!

【问题讨论】:

标签: .net f# fold function-composition


【解决方案1】:

我认为没有很好的方法将myfunc 的参数线程化到func1func2 的参数。但是,您的示例可能有点过于简单,因为您可以只写:

let myfunc x y = 
  func1 x y && func2 x y

我想实际上,你有更多的功能,然后使用fold 是很有意义的。在这种情况下,您可以使用fold 来组合函数,而不是使用它来组合结果

如果我稍微简化问题并假设func1func2 将这两个参数作为一个元组(而不是将它们作为两个单独的参数),那么您可以编写如下内容:

let func1 (a, b) = true
let func2 (a, b) = true

let myfunc = List.fold (fun f st a -> f a && st a) (fun _ -> true) [ func1; func2 ] 

现在您不需要显式地传递参数(到func1func2),但是fold 的参数有点复杂。我认为这很好,因为您只需要编写一次(而且这样可读性很强)。

但是,如果你是无点风格的粉丝(或者只是想看看你能走多远),你可以定义一些辅助函数,然后编写如下代码:

/// Given a value, returns a constant function that always returns that value
let constant a _ = a
/// Takes an operation 'a -> b -> c' and builds a function that
/// performs the operation on results of functions    
let lift2 op f g x = op (f x) (g x)

let myfunc2  = List.fold (lift2 (&&)) (constant true) [ ffunc1; ffunc2 ] 

如果您不需要任意数量的函数,那么我会简化代码并且根本不使用fold。如果您需要这样做,那么我认为您的版本非常可读且不会太长。我在这个答案中写的例子表明你可以避免手动传递参数,但是它使代码有点神秘。

【讨论】:

  • 我想如果我添加另一个间接层,我可以让它工作。是的,我认识到它可以简化为您的第一个示例,但我需要测试更多功能。谢谢你,我必须坐下来了解参数是如何通过您的示例插入到位的..
  • 我在那里看到了 S 和 K 组合子。我真的很想知道人们如何知道何时使用它们。尽我所能使用它们,我见过自己认出一个地方的唯一组合是 B..
  • 所以我这里的外卖,可以做,但是变得一团糟。过于具体的实现无法重用,而单个用例的实现又太多,所以坚持我的方法。
猜你喜欢
  • 2021-10-23
  • 2017-04-05
  • 2020-07-17
  • 2014-08-27
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 2018-12-17
  • 1970-01-01
相关资源
最近更新 更多