为什么我们用箭头显示多个参数,并用箭头显示返回类型?

Cra*_*ley 4 functional-programming elm

例如在Elm基础文档中:

(/) : Float -> Float -> Float
Run Code Online (Sandbox Code Playgroud)

就是说,这/是一个函数,它接受一个浮点数,另一个浮点数并返回一个浮点数。

为什么会这样:

(/) : (Float, Float) -> Float
Run Code Online (Sandbox Code Playgroud)

例如,这似乎更直观。

是否有特殊原因?这也是在Haskel中注释类型的方式。

https://package.elm-lang.org/packages/elm/core/latest/Basics

编辑:已经回答了,但是我也在Elm的文档中找到了这个:https : //guide.elm-lang.org/appendix/function_types.html

sep*_*p2k 9

从技术上讲,榆树的功能不止一个。类型Float -> Float -> Float(与之相同,Float -> (Float -> Float)因为它->是右关联的)代表一个接受a Float并返回另一个接受另一个float的函数的函数。然后,像这样的调用(/) a b(与之所以相同是((/) a) b因为函数应用程序是左关联的一样)首先将函数(/)应用于a,然后将结果函数应用于b

请注意,您也可以仅将其应用于/单个参数,而无需立即将结果应用于第二个参数:例如,inv = (/) 1将定义一个inv功能与相同的函数inv x = 1 / x

(Float, Float) -> Float将是采用包含两个浮点数的元组的函数的类型。您可以使用以下类型定义一个函数:

f: (Float, Float) -> Float
f (x,y) = ...
Run Code Online (Sandbox Code Playgroud)

然后,您可以将其称为f (arg1, arg2)where arg1arg2float或f tupwhere tup是两个float的元组。


Izb*_*gen 5

在函数式编程中,使用返回其他函数的版本更容易,因此当您看到(/) : Float -> Float -> Float它时,意味着可以传递一个参数并取回该函数Float -> Float。因此,有效的结果是没有区别的(假设您同时传递了两个参数)。

从元组版本(未咖喱)到功能版本(咖喱)的这种技术称为currying,已被广泛使用,并且在实践后将变得直观。我不熟悉,elm但是在Haskell中,您可以轻松地从咖喱版本返回:

f :: a -> (b -> c)     -- (which can also be written as    f :: a -> b -> c )
g :: (a, b) -> c

f = curry g -- transform argument from tuple to functions
g = uncurry f -- transform function arguments to tuple
Run Code Online (Sandbox Code Playgroud)

因此,如果仅将函数应用f到一个参数,则会获得可以重复使用的函数。请查看Haskell Wiki,以获取更多详细信息。与期望元组的功能相反,可重用性将受到限制。还要查看Wiki 的“ 部分应用程序”部分,以了解其重要性。

add2 :: Integer -> Integer -> Integer
add2 a b = a + b

add5 :: Integer -> Integer
add5 b = add2 5 b -- add2 is re-used
Run Code Online (Sandbox Code Playgroud)