LINUX.ORG.RU

haskell, типы


0

1

Помогите, пожалуйста, туповатому новичку. Как в хаскеле конвертировать типы? Напр. сделать из числа 123 строку «123» и наоборот. Ещё хаскель ругается при смешивании целых и вещественных чисел. Напр. хочу проверить число на полный квадрат:

perf n = floor (sqrt n) == n
-- или проверяем дробную часть на 0
perf n = (sqrt n) `mod` 1 == 0
не работают.

Ещё в хаскеле есть разные типы целых, как я понял: Int и Integer, которые тоже не дружат. Если не трудно, расскажите вкрадце, как связывать в работе основные типы (целые, вещественные числа, строки).

P.S. Как лучше проверить на тот же полный квадрат наиболее элегантно и чтобы быстро проверял? Нельзя ли что-то вроде

perf n = n == k^2 where k <- [1..]
?


> сделать из числа 123 строку «123» и наоборот

show, read, например

perf n = floor (sqrt n) == n

ЩИТО?

perf :: Int -> Bool

perf n = (floor.sqrt.int2Double $ n)^2 == n

Int и Integer, которые тоже не дружат

toInteger, fromInteger

perf n = n == k^2 where k <- [1..]

Это типа быстро? Ну держи:

perf n = n `elem` [x^2 | x <- [1..n]]

anonymous ()

Нельзя ли что-то вроде

perf n = n == k^2 where k <- [1..]

Функциональное изящество убивает здравый смысл? Таким боком при n = 10^6 он у тебя будет делать 1000 итераций. Уж если считать, то либо встроенными функциями с вещественной арифметикой, либо приличными численными методами.

Для вычисления корня из q можно искать ноль функции а f (x) = x^2 - q методом Ньютона. Для этого нужно итерировать g (x) = (x^2 + q)/(2*x). Для q = 10^6, если начинать с x = 1, ответ получается на 15 шаге. Хороша разница?

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

Извините, я же сказал — только учусь :)

А стандартный sqrt каким методом вычисляет корень? Неужели НЕ ньютоном?

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

А стандартный sqrt каким методом вычисляет корень? Неужели НЕ ньютоном?

Не знаю.

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