На странице https://en.wikibooks.org/wiki/Haskell/Denotational_semantics#Pattern_Matching есть следующее упражнение:
Рассмотрим функцию
or
двух логических аргументов со следующими свойствами:
- or ⊥ ⊥ = ⊥
- или Истина ⊥ = Истина
- или ⊥ Верно = Верно
- или Ложь y = y
- или х Ложь = х
Эта функция — еще один пример совместной строгости, но гораздо более острый: результатом будет ⊥, только если оба аргумента равны (по крайней мере, когда мы ограничиваем аргументы True и ⊥). Можно ли реализовать такую функцию на Haskell?
Функцию можно представить в виде следующей таблицы:
| ⊥ | False | True
------|-----------------------
⊥ | ⊥ | ⊥ | True
False | ⊥ | False | True
True | True | True | True
Эта функция является монотонной в соответствии с определением, данным в https://en.wikibooks.org/wiki/Haskell/Denotational_semantics#Monotonicity, поэтому я не вижу причин исключать возможность реализации этой функции в Haskell. Тем не менее, я не вижу способа реализовать это.
Какой ответ на упражнение?
PS: я понимаю, что ответ нет, вы не можете. Я ищу строгое доказательство. Я чувствую, что упускаю какое-то важное ограничение на то, какие функции могут быть определены. Определенно не все монотонные функции.
por
< /a> для параллельного или. - person chi   schedule 28.11.2019or x y
, вы должны оценить один из них, по крайней мере, чтобы определить, следует ли возвращатьTrue
илиFalse
. Какой бы изx
илиy
вы ни выбрали, у вас есть шанс, что это будет расходящееся вычисление, даже если другое нет. Параллелизм позволяет вам оценивать каждый из них понемногу, так что если есть не самое низкое значение, вы в конце концов найдете его. - person chepner   schedule 28.11.2019x
илиy
для вычисленияpor x y
, поскольку мы можем выполнять вычисления одновременно. На мой взгляд, это больше связано с отсутствием параллелизма в лямбда-исчислении. - person chi   schedule 28.11.2019