metaclass: (Default)
[personal profile] metaclass
Все таки в хаскеле кое-где проглядывают следы неадеквата, от которого не спасает даже система типов.
Вот например, если в исходнике написать десятичный литерал, типа 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 - точность числа.

Date: 2009-12-13 06:49 pm (UTC)
From: [identity profile] fas-tm.livejournal.com
Хм... Этот гемор стоит того ???
К тому же... если в серию запустить всю эту эзотерику, найдется ли еще кто либо с такими же мухами в голове чтобы адекватно поддерживать и развивать продукт ?

Date: 2009-12-13 07:03 pm (UTC)
From: [identity profile] metaclass.livejournal.com
По первому пункту - неизвестно. Мне интереснее по выходным заниматься хаскелем, чем вручную закатывать солнце на менее подходящих для этого языках. Даже если это не пойдет в продакшен, мозг целее будет. Альтернатива - в 50 лет пойти работать в НИИ Белкоопсоюза, поддерживая софт 20 летней давности на говноязыках.

По второму - это никого не волнует. Ни клиентов, ни руководство. Я поднимал более важный вопрос - что никто кроме меня толком не знает предметной области трех проектов - всем по барабану. "Дешево, быстро, проблем нет", все, никто не чешется.

Date: 2009-12-14 08:09 am (UTC)
From: [identity profile] g-rub.livejournal.com
Почему ты до сих пор не потребовал долю от прибыли вместо зарплаты? :)

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

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

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

Date: 2009-12-13 07:12 pm (UTC)
From: [identity profile] permea-kra.livejournal.com
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. Гм...

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

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

Date: 2009-12-13 07:19 pm (UTC)
From: [identity profile] nivanych.livejournal.com
Можно сделать свои классы,
получше организованные :-)

Date: 2009-12-13 07:23 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Я думаю, GHC от этого не станет вместо Fractional их использовать для вычисления значений литералов :)

Date: 2009-12-13 08:52 pm (UTC)
From: [identity profile] alexey-rom.livejournal.com
С {-# LANGUAGE NoImplicitPrelude #-} должен стать. Достаточно иметь функцию с названием fromRational. См. http://www.haskell.org/ghc/docs/latest/html/users_guide/syntax-extns.html#rebindable-syntax

Date: 2009-12-13 11:34 pm (UTC)
From: [identity profile] x-a-e-p.livejournal.com
Ребе, ну вы же понимаете почему Data.Decimal не инстанс Fractional и почему Data.Decimal - это неправильный тип для NUMERIC?

Date: 2009-12-13 11:41 pm (UTC)
From: [identity profile] x-a-e-p.livejournal.com
WRONG: про NUMERIC и Data.Decimal я таки соврал. А вот тем кто писал Data.Decimal таки мозг можно поебать. Оно во Fractional вписываться должно.

Date: 2009-12-14 03:26 pm (UTC)
From: [identity profile] clayrat.livejournal.com
чо, нету float нормального? лучше тогда сразу уже на maude писать, ввести свои числа арифметикой Пеано, потом операции - эдакий "функциональный ассемблер" =D

Date: 2009-12-14 05:50 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Сразу видно - опердень не писал. Какой флоат в финансовой арифметике, голову же оторвут за потерю точности :)

Date: 2009-12-14 05:51 pm (UTC)
From: [identity profile] clayrat.livejournal.com
да, далек я от финансов =D
(deleted comment)

Date: 2009-12-14 06:52 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Есть множество чисел, которые выражаются в виде конечных десятичных дробей, но не выражаются в виде конечных двоичных. В результате теряется точность, а алгоритмы, используемые в бухгалтерии, таковы, что эта потеря может нарастать по мере увеличения количества операций и их детализации.
Для денег поэтому всегда используют только decimal, в виде N/(10^M), где N и M - целые числа. В дельфи, в частности, N = [-2^63..2^63-1], M=4. И то, этого не всегда хватает, приходится извращаться с дополнительными масштабными коэффициентами.

Date: 2009-12-15 12:38 pm (UTC)
From: [identity profile] clayrat.livejournal.com
единственное, что я знаю об этой сфере - это что там пишут на таинственном языке R =D

Date: 2009-12-15 12:40 pm (UTC)
From: [identity profile] kurilka.livejournal.com
опердени на R?

Date: 2009-12-15 12:56 pm (UTC)
From: [identity profile] clayrat.livejournal.com
насчет R не знаю, а в молодости писал лабы по статистике на J - таки да, опердень на нем замаешься воротить =)

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 3rd, 2025 07:04 am
Powered by Dreamwidth Studios