LINUX.ORG.RU

Сорри, если вопрос слишком нубский.

Да не, ну что ты. Это слишком продвинутый вопрос для ЛОРа. Наверняка большинство пользователей ресурса на него ответить не смогут.

anonymous
()

Вычисляется ли выражение при сопоставлении с _?

А самому проверить?

> let _ = error "expression does evaluate when matched against underscore"
> 
theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

А это точно тоже самое, что проверка, например, в образцах аргументов функции?

Кстати, я, наверно, вообще туплю - там ведь и «обычный» аргумент(например, голова списка в x:xs) не вычисляется, пока не потребуется в теле. Так? Т.е. паттерн лишь смотрит «структуру», не разбирая сами значения, если это не требует сам паттерн(или паттерн, идущий раньше нашего)?

Сильно не пинайте, Haskell только начинаю изучать, но у меня привычка дотошно разбираться с тем, что именно происходит...

forCe
() автор топика
Ответ на: комментарий от forCe

паттерн лишь смотрит «структуру», не разбирая сами значения, если это не требует сам паттерн

Как-то криво сказано, просто вычисления происходят ровно настолько, чтобы можно было сопоставить паттерн: (x:xs) - требует чтобы внешний конструктор (как там модно, whnf) был (:) (т.е. не подходит [] и только он), если бы было (1:xs) - был бы еще шаг.

anonymous
()
Ответ на: комментарий от anonymous

только он

Ну и «bottom» (undefined / error) можно добавить.

anonymous
()
Ответ на: комментарий от theNamelessOne

что матчится в твоем примере? что мы должны увидеть? что мы бы увидели, если бы вычисление аргумента проводилось?

qnikst ★★★★★
()
Ответ на: комментарий от forCe

Там даже есть ленивый паттерн-матчинг (за достоверность термина не ручаюсь - давно было).

dave ★★★★★
()
Ответ на: комментарий от qnikst

что матчится в твоем примере?

wildcard-шаблон сопоставляется с правой частью выражения.

что мы должны увидеть?

Что сообщение об ошибке не вывелось.

что мы бы увидели, если бы вычисление аргумента проводилось?

«*** Exception: expression does evaluate when matched against underscore»

theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne
> let (Just x) = error "foo"
> 

сообщение об ошибке не вывелось...

qnikst ★★★★★
()
Ответ на: комментарий от theNamelessOne

В «let» lazy patterns, чтобы увидеть эксепшен, нужно использовать что-то наматченное:

> let (Just x) = error "hi"
x :: t
> x
*** Exception: hi

Аналог с case:

> case error "hi" of ~(Just _) -> 4
4

Обычный паттер матчинг:

> case error "hi" of Just _ -> 4
*** Exception: hi
anonymous
()
Ответ на: комментарий от qnikst

Да мне кажется, что я читал когда-то. Видимо не очень внимательно. Спасибо=)

forCe
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.