【问题标题】:How are values passed in F# for Functions?如何在 F# 中为函数传递值?
【发布时间】:2016-05-16 18:59:18
【问题描述】:

这是我学习 F# 的第一天。当我遇到以下主题的示例时,我正在浏览 tryfsharp.org Functions as Values

let chrisTest test =
 test "Chris"
let isMe x =
 if x = "Chris" then
    "it is Chris!"
 else
    "it's someone else"
chrisTest isMe

网站说明:- chrisTest 是一个简单的高阶函数,它针对字符串值执行测试。 isMe 函数检查字符串是否等于“Chris”。将 isChris 传递给 chrisTest 将字符串“Chris”作为参数传递给“isChris”函数,并返回“it is Chris!”的结果。

我的想法:-isMe 函数的值在程序的最后一行被传递给函数chrisTest。但是我没有得到的是没有传递给isMe 函数的值。 isMe函数如何决定执行返回什么值?

【问题讨论】:

  • chrisTest"Chris" 传递给您提供的每个参数(是的,参数是一个函数-因此更高阶)-所以当您传递isMechrisTest 最后一个将"Chris" 传递给isMe 并返回结果(在这种情况下为"it is Chris!") - 您可以通过将test "Chris" 更改为不同的东西来尝试此操作(如test "Christine")跨度>
  • 推论:- 所以函数执行的顺序很重要,因此chrisTest首先执行,其值'chris'传递给isMe。问题:- 我们是将chrisTest 传递给isMe 还是将isMe 传递给chrisTest?或者它是因为chrisTest 是高阶而写的,因此首先执行因此写为chrisTest isMe 而不是isMe chrisTesst
  • 正如 John Palmer 回答的那样,您可以使用替换来逐步减少和简化代码,一次一步。首先将chrisTest isMe替换为chrisTest的定义,test参数的值为isMe,给你isMe "Chris"。然后用它的定义替换isMe,其中x被替换为"Chris"等等。

标签: function f# functional-programming


【解决方案1】:

对于这种情况,我们可以从替换 christest 中的所有内容开始。然后你有

chrisTest isMe = isme "Chris" (as test=isme)

然后其余的遵循类似的过程

【讨论】:

    【解决方案2】:

    您为什么不将其输入 F# 交互式,以便您可以随时查看类型:

    let chrisTest test = test "Chris";;
    

    val chrisTest : test:(string -> 'a) -> 'a

    这里我们有一个函数,我们可以提供另一个函数作为来自string -> 'a 的参数(称为测试),它将使用参数“Chris”调用这个提供的函数,返回一些结果'a

    let isMe x =
        if x = "Chris" then
            "it is Chris!"
         else
            "it's someone else";;
    

    val isMe : x:string -> 字符串

    这里有我们简单的名称检查功能。

    请注意,此isMe 函数适合作为christTest 函数的参数提供。还要注意,如果我们提供chrisTest 的参数是string -> string 类型,我们将得到string 结果。希望您能在这里看到如何使用类型签名来帮助您推理程序的行为。

    因此,当我们将 isMe 作为参数提供给 chrisTest 时,chrisTest 函数会运行带有参数“Chris”的 isMe 函数,返回结果“它是 Chris!”。

    【讨论】:

      猜你喜欢
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-01
      • 1970-01-01
      • 2018-12-17
      相关资源
      最近更新 更多