metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2009-12-13 06:24 pm

Наркоманы

Все таки в хаскеле кое-где проглядывают следы неадеквата, от которого не спасает даже система типов.
Вот например, если в исходнике написать десятичный литерал, типа 1.5, то для того, чтобы он нормально скомпилировался в некий тип данных, нужно чтобы этот тип был инстансом Fractional. А Fractional - это класс чисел поддерживающих деление, что, по моему, к десятичным литералам относится весьма слабо.
Вот, к примеру, нужно мне хранить эквивалент SQL типа NUMERIC(M,N). Я использую Data.Decimal, но записать оный Data.Decimal в нормальном виде в исходнике не получается, т.к. инстансом Fractional он не является, потому что операция деления в нем реализована весьма хитро и не совместима с (/). В принципе достаточно реализовать fromRational, но там свои заморочки, например, 1.5::Rational - это 3%2, что к Decimal как бэ не сразу и преобразуешь.

PS: Дурь я эту временно обошел, методом записи в явном виде: Decimal N (число*(10^N) где N - точность числа.

[identity profile] permea-kra.livejournal.com 2009-12-13 06:59 pm (UTC)(link)
Прозреваю, что унутре парс 1.5 обрабатывается как 1 + 5/10 . Что логично, хотя и неудобно. Ребе, а read "smth" не проще написать?

[identity profile] metaclass.livejournal.com 2009-12-13 07:07 pm (UTC)(link)
read "1.5" :: Decimal можно, да. Хотя тормознее. Я бы хотел компилятор это на этапе компиляции заставить делать.

А вот как оно реально внутри обрабатывается - это загадка, потому что все что я вижу - требование иметь функцию fromRational класса Fractional.

[identity profile] permea-kra.livejournal.com 2009-12-13 07:12 pm (UTC)(link)
A floating literal stands for an application of fromRational to a value of type Rational, so such literals have type (Fractional a) => a. (c) prelude docs. Гм...

[identity profile] metaclass.livejournal.com 2009-12-13 07:15 pm (UTC)(link)
Я ж говорю - наркоманы :)

Ну в принципе Rational для десятичных чисел хорошо подходит, просто Fractional они зря сюда приплели, т.к. у него кроме fromRational еще (/) и recip которые тут ни с какого боку вообще.