我在test code看到了我认为的模式。 乍一看,它看起来像我以前从未见过的模式,但到底是什么?
我正在为可能遇到同样问题的人添加此条目。
答案 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
我希望这可以帮助那些第一次看到这样的代码片段时可能会感到困惑的人们。
没有参数/&#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