如何在lambda中为运算符赋予优先级?

11
例如,这个无法通过类型检查。
\cons nil -> 5 `cons` 3 `cons` nil

也不会这样

\(#) -> 5 # 3 # nil

虽然这两个都会

\cons nil -> 5 `cons` nil
\(#) nil -> 5 # nil

有没有一种方法可以在lambda表达式中为运算符指定中缀表示法?我试过了:

infixr 5 #
foo = \(#) nil -> 5 # 3 # nil

该错误出现是因为#未被定义。

foo = \(infixr 5 #) nil -> 5 # 3 # nil

这只是一个语法错误。

我该怎么办?

1个回答

16

修正声明可以是局部的,但必须与定义一起出现,所以您需要编写类似以下内容的内容:

修正声明可以是局部的,但必须与定义一起出现,所以您需要编写类似以下内容的内容:

foo cons nil = 'a' # 'b' # nil
  where (#) = cons
        infixr 5 #
或者
foo = \cons nil -> let (#) = cons; infixr 5 # in 'a' # 'b' # nil

4
确实不错!这是Haskell98、Haskell2010的一部分还是只属于GHC呢? - leftaroundabout
1
我特别喜欢 let 版本。 - PyRulez
1
这是Haskell 98。 let和where的语法涉及“decls”,其中包括类型签名、优先级声明以及函数和模式绑定。 - Reid Barton
请勿写let版本 - jberryman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接