Шаблон Lazy Haskell в логическом выражении? - PullRequest
0 голосов
/ 09 апреля 2011

В выражении case, таком как:

case b of True  -> 17
          False -> 18

будет любая лень в:

case b of True  -> 17
          _     -> 18

, то есть с использованием шаблона _вместо False?

Если для Bool нет лени, это также относится к:

data Three = One|Two|Three
case x of One -> 17
          _   -> 18

Ответы [ 2 ]

3 голосов
/ 09 апреля 2011

Нет.b оценивается в WHNF, чтобы проверить, какой конструктор Bool был использован.На этом этапе оценивать уже нечего.

2 голосов
/ 09 апреля 2011

Нет, это выражение для случая будет оценивать b, но, конечно, только , если выражение, в котором оно содержится, само оценивается по любой причине.

Например, в

(42, case b of { True -> 43; False -> 41})

b не будет оцениваться до тех пор, пока второй элемент кортежа не станет равным.

В общем случае неопровержимый шаблон не будет увеличивать лень, если предыдущие шаблоны требовали оценки значения - помните, что шаблоны случаяпробуются строго последовательно в том порядке, в котором они даны.И поскольку нет ничего похожего на «неравномерное» всегда вычисляемое значение, выражение case остается оцененным.

...