在Elm-Lang中,\ _ - >是什么?声明(符号,运算符,模式)是什么意思?

时间:2016-10-12 23:20:32

标签: elm

我在test code看到了我认为的模式。 乍一看,它看起来像我以前从未见过的模式,但到底是什么?

我正在为可能遇到同样问题的人添加此条目。

2 个答案:

答案 0 :(得分:7)

\_ ->是一个带有一个参数的匿名函数,但它不使用函数体中的参数,所以不是像\a ->那样命名它只是使用{{1}丢弃参数}。

答案 1 :(得分:-1)

实际上 不是模式 ,而是 lambda (匿名函数,一个函数定义,没有绑定标识符。)正如elm slack group的megapctr指出的那样。

我在这个context中找到了这个lambda:

unstyledDiv : Test
unstyledDiv =
    let
        input =
            Fixtures.unstyledDiv

        output =
            ""
    in
        describe "unstyled div"
            [ test "pretty prints nothing, because the stylesheet had no properties." <|
                \_ ->
                    prettyPrint input
                        |> Expect.equal (output)
            ]

因此,为了更好地理解这个lambda在这种情况下是如何工作的。我用elm-repl写了我的lambda(\ _ - &gt;&#34; helloWorld&#34;)。

(\_ -> "helloWorld") 5
(\_ -> "helloWorld") 4.0
(\_ -> "helloWorld") "abalone"
(\_ -> "helloWorld") not
(\_ -> "helloWorld") abs

输出:&#34; helloworld&#34; :字符串

所有产生相同的输出:&#34; helloworld&#34; :String 适用于任何类型输入, Int Float 字符串功能

然后模拟与我使用管道的测试代码相同的格式,&lt; |,lambda到身份功能,这应该会产生相同的输出:&#34; helloworld&#34;

identity <| (\_ -> "helloWorld") "anything"

输出:&#34; helloworld&#34; :字符串

为了更接近测试代码片段,我做了以下

(identity <| (\_ -> "helloworld" ) "anything") |> String.reverse

输出:&#34; dlrowolleh&#34; :String

我希望这可以帮助那些第一次看到这样的代码片段时可能会感到困惑的人们。

另一个类似的例子

\() - &gt;声明

没有参数/&#34;没有命名参数本机类型&#34; LAMBDA

lambda,不带参数: \() - &gt; &#34; hellouniverse&#34;

(\() -> "hellouniverse") ()

输出:&#34; hellouniverse&#34; :String

(identity <| (\() -> "helloworld" ) ()) |> String.reverse

输出:&#34; esrevinuolleh&#34; :String

如果您尝试传递()以外的参数,则单位,例如字符串 Int Float ,或功能会导致编译错误。

以下错误

传递 Int ,5

的示例
==================================== ERRORS ====================================

-- TYPE MISMATCH --------------------------------------------- repl-temp-000.elm

The argument to this function is causing a mismatch.

4|    \() -> "hellouniverse" ) 5
                               ^
This function is expecting the argument to be:

    ()

But it is:

    number

传递功能,身份

的示例
==================================== ERRORS ====================================

-- TYPE MISMATCH --------------------------------------------- repl-temp-000.elm

The argument to this function is causing a mismatch.

4|    \() -> "hellouniverse" ) identity
                               ^^^^^^^^
This function is expecting the argument to be:

    ()

But it is:

    a -> a

演示使用 No Arg lambda

将测试定义如下:

test x = 
   ((++) "super  "  <|  ( (\() -> "hellouniverse" ) <| x )) |>  String.reverse

然后应用函数只传递单位符号,():

test ()

输出:&#34; esrevinuolleh repus&#34; :String