LINUX.ORG.RU

типы в haskell


0

0

Доброго времени суток!
Во первых, прошу с пониманием отнестись к моей проблеме, хотя она, должно быть и покажется Вам смешной. Я только учусь.
А учу я хаскель. Дочитал "Мягкое введение" до типов и классов - вроде всё понял. А, оказывается, я ошибался. Вот эта в-ция, по идее, должна была выдавать н-ую цифру в десятичной записи числа. А она вместо этого только ругается на несогласованность типов.
Пожалуйста, поправьте! А ещё, не могли бы Вы мне кинуть ссылки на более вменяемые учебники по типам и классам хаскеля - для меня это первый функциональный ЯП, да и вообще весь мой предыдущий опыт программирования заканчивается на прочтении СИКПа.

nth :: (Integral a) => a -> a -> a
nth n number | n == 1 = number - 10 * (truncate new)
| True = nth (n - 1) (truncate new)
where new = number / 10


ну как бы функция (/) подразумевают, что ее аргументы должны быть в классе Fractional, а не Integral.

cathode
()

предыдущий пост +

where new = (fromIntegral number) / 10

hatefu1_dead
()

>> А ещё, не могли бы Вы мне кинуть ссылки на более вменяемые учебники по типам и классам хаскеля - для меня это первый функциональный ЯП, да и вообще весь мой предыдущий опыт программирования заканчивается на прочтении СИКПа.

Ну как бы вот: http://book.realworldhaskell.org/read/ если чего могу pdf-ом поделиться

cathode
()

OReilly "Real World Haskell"

вобщем, aMule или другая прога - и вперед. Толковая книга, сам по ней сейчас учу.

P.S. просьба не удалять пост как варез :)

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

Если не жалко, киньте, пожалуйста на мыло lllxa3aplll@gmail.com (и анонимус тоже) -- торренты и прочее p2p мне ну никак нельзя. Может есть какие книги по ФП вообще? Алгоритмам там... СИКП я прочёл, мало как-то (примеры понятны, а вот сам писать в таком стиле не научился).

xa3ap
() автор топика

1) Культура хаскеля - в гардах писать не True а otherwise. Оно, конечно, и так, и так работает, но понятнее.

2) Вместо truncate (fromInteger number / 10) лучше писать div number 10 - или в инфиксной нотации: number `div` 10

3) Вместо number - 10 * (number `div` 10) лучше писать number `mod` 10

4) Вместо явного сравнения с 1 в гарде лучше паттерн-матчить:

nth 1 number = number `mod` 10 nth n number = nth (n - 1) $ number `div` 10

5) В типе - n и number совершенно не обязаны быть одного типа, так что лучше всего - вообще аннотацию типа не указывать, пусть компилер сам выведет.

Miguel ★★★★★
()

http://learnyouahaskell.com/

Это лучшее руководство по haskell для новичков. После этого уже можно не сильно напрягаясь читать мягкое введение.

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