kb
21.11.2012 06:46
Как-то я не понимаю, как я должен был догадаться о чем ошибка в подобном примере (показан тип, затем правильный пример, затем неправильный).
Prelude> :t ([3,4,5] >>=)
([3,4,5] >>=) :: Num a => (a → [b]) → [b]
Prelude> [3,4,5] >>= \x → [x,-x]
[3,-3,4,-4,5,-5]
Prelude> [3,4,5] >>= \x → x
<interactive>:15:2:
No instance for (Num [b0])
arising from the literal `3'
Possible fix: add an instance declaration for (Num [b0])
In the expression: 3
In the first argument of `(>>=)', namely `[3, 4, 5]'
In the expression: [3, 4, 5] >>= \ x → x
Контекста не хватает.
чё?
без поллитры не разобраться грит
я к тому, что в последнее время (последствие той копипасты ошибки компиляции на 100страниц от дедфуда) понимаю, что чем продвинутее статическая типизация, тем сложнее её отладка. в данном случае контекста вообще никакого нет, это из книжки (которую @ak3n говорил, что дочитал :)
ну и х-ль был моей последней надеждой (пока еще остаётся) на вменяемость ошибок компиляции, но вот подобное как-то не понимаю (то ли я неправильно читаю, то ли х-ль еще не настолько умён)
норм блог
Не мне, а компилятору не хватает. Операция связывания (>>=) принимает монадическое значение (с контекстом) передает обычной функции и возвращает опять монадическое. А ты возвращаешь просто x. Значение без контекста. То есть [x] — норм, т.к. листы тоже монады.
А мне наоборот иногда в питоне не хватает типов после джавы.
Ну я-то это понимаю. Но вопрос, как человеку нормальному это понять? То есть, я чувствую, что из типа можно увидеть и дать нормальную (по моему мнению) ошибку компиляции, вида "ты возвращаешь тип X, а нужно тип [X]", а оно какое-то говно выводит (и ошибку вообще не в том месте показывает). Понимаешь?
Ну он и говорит: не определен instance для типа Num.