为什么我们不在Elm函数组合中指定参数?

时间:2017-09-17 23:28:39

标签: functional-programming elm

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

  

fn:String - >串

你能组成一个传递了多个参数的函数吗?

3 个答案:

答案 0 :(得分:2)

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)

答案 1 :(得分:0)

注意,我不认识榆树,但我想我可以用一般的方式回答这个问题。

假设你有一个功能:

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

并说你想以任何理由给这个函数另一个名字。你可以写:

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

您指定otherName的参数,然后手动将其传递给addTwo

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

otherName = addTwo

这与问题有什么关系?假装addTwo是一个作文。它需要一个数字,并返回一个数字。与第二个示例中一样,您可以明确地将参数写出来,但这不是必需的。实际上,当您为变量分配合成时,您所做的就是为合成函数指定名称。参数与此无关。

答案 2 :(得分:0)

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

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

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

elm-guide

中的更多详细信息