是否可以在lambda表达式中使用无可辩驳的波浪号(`~`)模式?

hug*_*omg 21 haskell pattern-matching

GHC给了我一个parse error on input \~如果我尝试在lambda表达式的模式上使用波形符,就像我可以用命名函数做的那样

let step = \~(x,s) -> run (f x) s  -- Parse Error

let step ~(x, s) = run (f x) s -- Works fine
Run Code Online (Sandbox Code Playgroud)

hug*_*omg 21

你必须在lambda和tilde之间添加一个空格

\ ~(x,s) -> run (f x) s
Run Code Online (Sandbox Code Playgroud)

混淆的原因是因为\并且~都是用户定义的运算符的有效字符,因此\~被解析为一个而不是被解析为lambda表达式的开头:

-- Defining a custom \~ operator is allowed:
let a \~ b = {- ... -} 
Run Code Online (Sandbox Code Playgroud)

  • 不过,您应该添加说明.````和`~`都是符号,可以出现在运算符中,所以`\ ~`被作为一个标记. (12认同)