LINUX.ORG.RU

Типизация в Хаскеле - вопрос


0

0

Доброго времени суток!
Начал изучать Хаскель и столкнулся с такой проблемой:
Пишу код

fac 0 = 1
fac n | n > 0 = n * fac (n-1)

bin_k r k = (fac k) / ((fac r) * fac (k-r))

bin_dist k n p = (bin_k k n) * p ^ k * (1 - p) ^ (n - k)

пытаюсь вызвать bin_dist 2 4 0.4 и получаю:
ERROR - Unresolved overloading
*** Type       : (Fractional a, Integral a) => a
*** Expression : bin_dist 2 4 0.4

смотрю тип bin_dist:
bin_dist :: (Integral a, Fractional a) => a -> a -> a -> a

Возникают вопросы:
а) означает ли такой тип функции, что ей можно передавать аргументы лишь одного типа?
б) правильно ли я понял, что вывелся полиморфный тип аргумента, заявленный экземпляром двух классов у которых нет совместной реализации (т.е. нет типа, реализующего оба)?
в) как правильно решить возникшую проблему?
anonymous

Ответ на: комментарий от grob

Спасибо за ответ! Я так и подозревал, что дело в приведении типов (точнее, в том, что я его не указал). YAHT читаю, просто еще не дошел до подробного разбора типов и классов. Ну и конечно сказывается привычка программирования на языках с динамической типизацией.

Только надо приведение к дробному типу делать в bin_k, так как уже там может получиться нецелое число. Тогда все становится хорошо: Main> :t bin_k bin_k :: (Fractional a, Integral b) => b -> b -> a Main> :t bin_dist bin_dist :: (Integral a, Fractional b) => a -> a -> b -> b Main> bin_dist 2 4 0.4 0.3456

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

Main> :t bin_k
bin_k :: (Fractional a, Integral b) => b -> b -> a
Main> :t bin_dist
bin_dist :: (Integral a, Fractional b) => a -> a -> b -> b
Main> bin_dist 2 4 0.4
0.3456

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

Может стоит выкинуть привычки появившиеся после языков с динамической типизацией и начать указывать типы явно? Это спасет от многих ошибок, плюс люди читающие ваш код скажут "спасибо", да и хаскелл все таки язык со статической типизацией.

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

Просто мне очень пронравилась система автоматического выведения типов и я еще играюсь, экспериментирую с ней. Когда перейду к решению реальных задач, то буду серьезнее относится к таким вещам. Благо одна набитая шишка уже имеется.

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