当前位置: 首页 > 知识库问答 >
问题:

Haskell优先级:Lambda和运算符

胡越泽
2023-03-14

我发现优先级和关联性是一个很大的障碍,让我理解语法在haskell代码中试图表达的内容。

例如,

blockyPlain :: Monad m => m t -> m t1 -> m (t, t1)
blockyPlain xs ys = xs >>= \x -> ys >>= \y -> return (x, y)

通过实验,我终于明白了,

blockyPlain xs ys = xs >>= (\x -> (ys >>= (\y -> return (x, y))))
blockyPlain xs ys = xs >>= (\x -> ys) >>= (\y -> return (x, y))
*Main> blockyPlain [1,2,3] [4,5,6]
[(1,4),(1,5),(1,6),(2,4),(2,5),(2,6),(3,4),(3,5),(3,6)]

你们谁能提供一些参考,让语法更容易掌握吗?

共有1个答案

曾丰茂
2023-03-14

lambda的规则非常简单:lambda的主体尽可能向右延伸,而不会碰到不平衡的括号。

f (\x -> foo (bar baz) *** quux >>= quuxbar)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                       body
 类似资料:
  • 正则表达式与数学表达式的不同在于,数学表达式执行数学运算,而正则表达式执行字符运算;相同的是,它们都按一定的优先级进行运算 运算符 操作 \ 转义符 () 捕获、匹配、断言 [] 字符类 *+? 限定符 {} 范围 ^$ 位置和顺序 | 或

  • 从高到低顺序如下: ^ not - (一元运算) * / + - ..(字符串连接) < > <= >= ~= == and or

  • 通过前面的学习我们知道运算符有不同的类型,当这些不同类型的运算符出现在同一个表达式中时,就必须遵循运算符的优先级来进行运算,才能保证运算的合理性和结果的正确性、唯一性。运算符的优先级决定了表达式中各个部分执行运算的先后顺序。 下表中详细介绍了 C# 中运算符的优先级顺序: 优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[整型表达式] 左到右   () 圆括号 (表

  • 运算符的优先级决定了不同的运算符在表达式中计算的先后顺序,下表列出了 MySQL 中的各类运算符及其优先级。 优先级由低到高排列 运算符 1 =(赋值运算)、:= 2 II、OR 3 XOR 4 &&、AND 5 NOT 6 BETWEEN、CASE、WHEN、THEN、ELSE 7 =(比较运算)、<=>、>=、>、<=、<、<>、!=、 IS、LIKE、REGEXP、IN 8 | 9 & 10

  • 所有的数学运算都认为是从左向右运算的, Java 语言中大部分运算符也是从左向右结合的,只有单目运算符、赋值运算符和三目运算符例外,其中,单目运算符、赋值运算符和三目运算符是从右向左结合的,也就是从右向左运算。 乘法和加法是两个可结合的运算,也就是说,这两个运算符左右两边的操作数可以互换位置而不会影响结果。运算符有不同的优先级,所谓优先级就是在表达式运算中的运算顺序。 一般而言,单目运算符优先级较

  • 问题内容: 由于Java中运算符优先级的正确性,我感到困惑。我在教程很久以前读到并具有更高的优先级高于OR,这是在提供的答案确认问题。但是,我目前正在使用《 Sun Java 6认证程序员学习指南》学习Java。本书包含以下示例: 我复制并引用了有关编译器如何处理上述代码的解释: 是,然后是或结果 为,然后打印。由于存在短路,因此对表达式进行评估,好像周围有括号。换句话说,它被评估为之前的单个表达