Недавно я столкнулся с ошибкой при использовании threepenny-gui, и это было решено путем изменения кода из совпадения шаблонов в обозначении <-
, чтобы сопоставить образец с обозначением let.Соответствие шаблону в примечаниях к примечанию vs let
Есть ли причины, по которым я должен ожидать изменения в поведении при изменении между этими двумя формами соответствия шаблонов?
В частности, следующий код:
В монаде IO:
Just events <- Map.lookup elid <$> readMVar sElementEvents
было изменено на:
mevents <- Map.lookup elid <$> readMVar sElementEvents
let Just events = mevents
Вот ссылка на совершение фиксированной проблемы для меня: https://github.com/Davorak/threepenny-gui/commit/fbf6cbe25875fafdc64f7a111ddebf485b45143b
Дополнительная плата Детали TFORM: ОС: 10.8.5 GHC: 7.6.3
редактировать: добавить тот факт, что это происходит в IO монада
Это очень хороший вопрос и отвечает на вопрос как отправлено. Это подразумевает, что существует некоторая разница в строгости, которая заставляет ошибку запускаться в обозначении do, но не с обозначением let в этом случае. Соответствие шаблону в монаде IO заставляет шаблон шаблона совпадать, а let - ленивый и позволяет ему оценивать позже, если потребуется? – Davorak
'let' может определенно быть более ленивым, как с чем-то вроде' do {let Just x = Just(); return x} 'равнозначно' return (пусть Just x = Just() в x) ', в то время как то же самое с привязкой шаблона привязки все равно должно дать монаде шанс выполнить привязку. –
Эта странная небольшая разница в семантике на самом деле является цельной причиной, почему «Monad' имеет функцию« fail », поскольку она появилась до того, как« MonadPlus »сделал. Существуют также различные предложения, которые имеют шаблон «Monad», соответствующий либо desugar, либо 'let' binding, либо действительный только для экземпляров« MonadPlus ». –