a property of some binary operations, which means that rearranging the parentheses in an expression will not change the result.
Опираясь на это определение, можно сказать, что если мы используем ассоциативную функцию, то можно и опустить скобки, ведь, они ничего и не решают, несмотря на последовательность, результат будет таким же. Чем и пользуются в хаскелле:
[1] <> ([2] <> [3])
([1] <> [2]) <> [3]
Прелюдка: [1,2,3]
Но, это была инфиксная форма. Почему в префиксной форме я обязан ставить () для того, чтобы задать последовательность для ассоциативной функции?
mappend [1] (mappend [2] [3])
Почему нельзя написать так:
mappend [1] mappend [2] [3]
Вопрос, наверное, скорее по дизайну языка. Наверное, можно сказать, что я просто хочу инфиксный оператор, раз задаюсь вопросом о записи выше. Или, может, я чего-то не понимаю.
Это при префиксе, хорошо, спасибо. А для инфиксного оператора работает другое специально применение, которое учитывает ассоциативность функции? Или уступает по приоритету
не уверен, что понял вопрос. в Хаскеле апликация не учитывает ассоциативность, ассоциативность имеет смысл только для инфиксных форм
Да, вопрос был об этом, спасибо!
точнее, при наличии нескольких инфкиксных форм в одном бесскобочном выражении проверяется ассоциативность (associativity) и приоритет (precedence), совместно именуемые очерёдностью (fixity)
кстати, любую функцию можно применить и префиксно, и инфиксно, синтаксис применения только зависит от имени — знаками оно написано или буквами: a + b == (+) a b op a b == a `op` b
Обсуждают сегодня