kosc
• In the second argument of ‘(/)’, namely ‘b’ In the expression: ((- c) :+ 0) / b In an equation for ‘alone’: alone = ((- c) :+ 0) / b Почему? В Prelude он как нефиг делит Complex на Floating.
Alexander
чего?!
Alexander
может там написано было (c::Complex) /2
kosc
Там - это где?
kosc
Prelude Data.Complex> (2 :+ 1) / 3.2 0.6249999999999999 :+ 0.31249999999999994
kosc
Вот из прелюдии.
kosc
Вроде на одной стороне - Complex, на другой - Floating.
kosc
Или я неправ?
Alexander
не прав
Alexander
Floating это класс типов, Complex это тип
Alexander
поэтому 3.2 имеет тип Complex Double тут
kosc
Аааа, окей.
Alexander
т.к. Complex Double является Floating
Alexander
в примере нужно realToFrac натравить на b
kosc
Ну а почему я не могу Complex Double на Double поделить-то?
kosc
Ааа
kosc
Ок
kosc
А в чём суть?
Alexander
суть в том, что деление: (/) :: Fractional a => a -> a -> a
Alexander
оба аргумента имеют один и тот же тип
Alexander
поэтому поделить Complex на Double нельзя
Alexander
(да Num ужасный класс типов)
Alexander
т.к. если бы это было линейное поле, то тогда конечно деление Complex Double на Double было бы хорошей операцией
Alexander
ещё можно сделать (/realValue) <$> complexValue
Alexander
наверное
Alexander
Prelude Data.Complex> (/5) <$> 15 :+ (-5) 3.0 :+ (-1.0)
Alexander
т.к. Complex является Functor, в котором функция применяется ко всем значениям, что в делении и нужно
kosc
Ага, вроде раскурил.
Alexander
можно написать let a ^/ b= fmap (/b) a
kosc
И более того, оно скомпилялось.
kosc
Правда пока что вместо реальной части комплексного результата выдаёт NaN
Alexander
можно кусок кода?
kosc
https://dpaste.de/5khq
Vasiliy
а у меня такой вопрос - a == 0.0 - это нормально?
kosc
Ну так это ж когда нет первого коэффициента.
kosc
Тогда корень априори один.
kosc
x^2 = 0 получается
Vasiliy
я почему спрашиваю
kosc
Остаётся bx+c=0
Vasiliy
> 0.0 == 0.3 - 0.2 - 0.1 False
Alexander
ну /(2a)
Alexander
чего ещё ожидать
kosc
Оооо
Alexander
на 0 делить непринято
kosc
Блин
Alexander
f operator = -b `operator sqrt d / (2*a)`
kosc
Это форматирование сломалось или предлагаете так сделать?
kosc
Если что, тройное ` - цитирование.
kosc
import System.IO import Text.Read import Data.Complex data Solution a = OneSolution a | TwoRealSolutions a a | TwoComplexSolutions a a deriving (Show) prompt :: (Read a) => String -> IO a prompt text = do putStr text hFlush stdout line <- getLine case readMaybe line of Just x -> return x Nothing -> putStrLn "Invalid number entered" >> prompt text solveEquation :: (RealFloat a, Floating a, Ord a) => a -> a -> a -> Solution (Complex a) solveEquation a b c | a == 0.0 = OneSolution alone | d < 0.0 = TwoComplexSolutions x1 x2 | d == 0.0 = OneSolution x1 | d > 0.0 = TwoRealSolutions x1 x2 where d = b*b - 4*a*c x1 = f (+) :+ 0 x2 = f (-) :+ 0 f operator = -b `operator` sqrt d / (2*a) alone = ((-c) :+ 0) / realToFrac b main :: IO () main = do a <- prompt "Input a: " b <- prompt "Input b: " c <- prompt "Input c: " print $ solveEquation a b c
Vasiliy
я к тому, что сравнивать флоаты так нельзя
kosc
Оу, сорян, хз, зачем сюда спастил.
kosc
Ну я хз, как сделать.
kosc
Там сначала 0 был
Alexander
@hotkosc это цитата из кода
kosc
Но потом мне кто-то сказал, что с 0.0 более правильно, так как там Floating.
Alexander
флоаты конечно нельзя сравнивать так
Λrtem
в числах с плавающей точкой есть погрешность
Alexander
впрочем там при b == 0 все равно проблема
kosc
Так
Alexander
http://hackage.haskell.org/package/ieee754-0.8.0/docs/Data-AEq.html
Alexander
~== то, что интересует
Alexander
@hotkosc кстати поменяй Solution тип
Alexander
data Solution a = One a | TwoReal a a | TwoComplex (Complex a) (Complex a)
Alexander
с другой стороны это не достаточно обще 😏
Alexander
т.к. почему запрещено агрументы комлексные иметь
Alexander
но пофиг
Alexander
ещё можно добавить NoSolution для случай solve 0 0 1
Alexander
ну или какое исключение
kosc
Это да
kosc
Ладно, я на сегодня наверное свернусь, всем большое спасибо.
kosc
Завтра попробую допилить.
kosc
Блин, насколько это проще всё может быть: https://rosettacode.org/wiki/Roots_of_a_quadratic_function#Haskell
kosc
Вообще дичь
ᛏᚺᛖ ᛚᛖᛋᛒᛁᚨᚾ ᛗᚨᚾ ᚷᛁᚱᛚ 🐝
Блин, насколько это проще всё может быть: https://rosettacode.org/wiki/Roots_of_a_quadratic_function#Haskell
а потом пытаешься решить общее полиномиальное уравнение и становится грустно :с
kosc
Всмысле, оно ещё проще?
ᛏᚺᛖ ᛚᛖᛋᛒᛁᚨᚾ ᛗᚨᚾ ᚷᛁᚱᛚ 🐝
Всмысле, оно ещё проще?
не совсем точнее совсем нет не существует общего аналитического способа решить уравнение P(x) = 0, где P(x) некий полином от x
kosc
А, всё, понял.
Alexander
ну тот вариант падает при a == 0
ᛏᚺᛖ ᛚᛖᛋᛒᛁᚨᚾ ᛗᚨᚾ ᚷᛁᚱᛚ 🐝
Alexander
b=+-d (это возможно?)