【问题标题】:Why we do not specify parameters in Elm function composition?为什么我们不在 Elm 函数组合中指定参数?
【发布时间】:2023-03-24 19:06:01
【问题描述】:

我正在查看函数组合的各种示例,它们都具有说明输入和输出参数的类型定义。另一方面,函数定义不传递参数。是因为所有函数都具有相同的类型签名吗?我见过的所有例子都是

fn: 字符串 -> 字符串

你能编写一个传递多个参数的函数吗?

【问题讨论】:

标签: functional-programming elm


【解决方案1】:

Elm 函数类型定义的工作方式如下:

myFunction : FirstArg -> SecondArg -> ... -> LastArg -> ReturnType

例子:

-- one argument
sqrt : Float -> Float

-- two arguments
rem : Int -> Int -> Int

-- no arguments (constant!)
pi : Float

组合函数具有这种类型签名:

(>>) : (a -> b) -> (b -> c) -> a -> c

如果加上括号,可以认为是

(>>) : (a -> b) -> (b -> c) -> (a -> c)

因此,它需要一个参数的两个函数并返回一个参数的另一个函数。

如果你想将它与接受更多参数的函数一起使用,你必须部分应用它们,使它们只需要一个参数:

((+) 5) >> ((*) 2)
-- (+) needs two arguments
-- (+) 5 needs one argument
-- same with (*) and (*) 2
-- the above line is the same as
\num -> 2 * (5 + num)

【讨论】:

    【解决方案2】:

    注意,我不认识 Elm,但我想我可以笼统地回答这个问题。

    假设你有一个函数:

    function addTwo(n) {
        return n + 2;
    }
    

    说你想给这个函数另一个名字,不管出于什么原因。你可以写:

    function otherName(n) {
        return addTwo(n);
    }
    

    你指定otherName的参数,然后手动传给addTwo

    但是等等,如果你所做的只是将参数直接传递给内部函数,那么是否有必要指定参数?为什么不直接写:

    otherName = addTwo
    

    这与问题有什么关系?假装addTwo 是一个组合。它接受一个数字,并返回一个数字。就像在第二个示例中一样,您可以显式地写出参数,但这不是必需的。实际上,当您将组合分配给变量时,您所做的只是给组合函数一个名称。参数与此无关。

    【讨论】:

      【解决方案3】:

      您可以在 elm 中定义具有多个参数的函数,为此您需要在函数签名类型定义中使用(来自)两个箭头:

      divide: Float -> Float -> String
      divide x y =
        x / y |> toString
      

      所以:第一个参数的类型,然后是第二个参数的类型,然后是返回值的类型。

      更多详情在elm-guide

      【讨论】:

        猜你喜欢
        • 2019-04-03
        • 2013-05-28
        • 2011-01-17
        • 1970-01-01
        • 2013-09-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多