【问题标题】:Elm: Partial Function Application and LetElm:部分函数应用和让
【发布时间】:2018-06-12 19:19:19
【问题描述】:

Beginning Elm - Let Expression 页面建立在上一页的基础上,但不包括如何更新 main 函数,用正向函数表示法编写,即:

main =
    time 2 3
        |> speed 7.67
        |> escapeEarth 11
        |> Html.text

包括新的fuelStatus参数。

编译器抱怨类型不匹配,这是正确的,因为 escapeEarth 现在有第三个参数,它是一个字符串。

如该网站所述,“前向函数应用程序运算符从前一个表达式中获取结果,并将其作为最后一个参数传递给下一个函数应用程序。”

换句话说,我该怎么写:

Html.text (escapeEarth 11 (speed 7.67 (time 2 3)) "low")

使用前向表示法?

另外,为什么不打印“登陆无人机”和“留在轨道上”?它只打印“留在轨道上”:

module Playground exposing (..)

import Html


escapeEarth velocity speed fuelStatus =
    let
        escapeVelocityInKmPerSec =
            11.186

        orbitalSpeedInKmPerSec =
            7.67

        whereToLand fuelStatus =
            if fuelStatus == "low" then
                "Land on droneship"
            else
                "Land on launchpad"
    in
    if velocity > escapeVelocityInKmPerSec then
        "Godspeed"
    else if speed == orbitalSpeedInKmPerSec then
        "Stay in orbit"
    else
        "Come back"


speed distance time =
    distance / time


time startTime endTime =
    endTime - startTime


main =
    Html.text (escapeEarth 11 (speed 7.67 (time 2 3)) "low")

【问题讨论】:

  • whereToLand 不会“打印”,因为它不是从函数返回的。它在 let 表达式中定义,但未在表达式中使用。
  • 谢谢 Tyler,我明白了我的错误,第二个应该是 else whereToLand fuelStatus,而不是 else "Come back"

标签: elm let


【解决方案1】:

我认为你需要的是

main =
    time 2 3
        |> speed 7.67
        |> \spd -> escapeEarth 11 spd "low"
        |> Html.text

换句话说,您定义了一个小的匿名函数来正确插入值。您可能想看看是否应该使用不同的顺序定义 escapeEarth 函数。

如果您喜欢“免费点”,另一种选择是

main =
    time 2 3
        |> speed 7.67
        |> flip (escapeEarth 11) "low"
        |> Html.text

有些人会认为这不太清楚

关于你的第二个问题,你在 let 语句中定义了函数,但从未实际使用过它

【讨论】:

  • 三个不同的答案,每一个都是解决问题的有效方法。非常感谢西蒙。请你看看我的第二点,为什么只打印一个字符串而不是两个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
相关资源
最近更新 更多