Я просто изучаю haskell (самостоятельно, для удовольствия) и я наткнулся на стену.
Мой вопрос:
Как я могу определить функцию
flrt = (floor . sqrt)
Когда я пробую ее в файле и компилирую, GCHi жалуется на следующее:
AKS.hs:11:9:
No instance for (RealFrac Integer)
arising from a use of `floor'
Possible fix: add an instance declaration for (RealFrac Integer)
In the first argument of `(.)', namely `floor'
In the expression: (floor . sqrt)
In an equation for `flrt': flrt = (floor . sqrt)
AKS.hs:11:17:
No instance for (Floating Integer)
arising from a use of `sqrt'
Possible fix: add an instance declaration for (Floating Integer)
In the second argument of `(.)', namely `sqrt'
In the expression: (floor . sqrt)
In an equation for `flrt': flrt = (floor . sqrt)
Я не понимаю, почему результирующая функция не просто Внутр -> Внутр.
Я только что закончил второй курс CS и прошел базовый курс PL. Я слышал о, но еще не совсем понимаю типы. Я попытался прочитать несколько руководств по хаскелю, но все это выше моей головы.
П.С. - Я тоже не понимаю, что такое монада. (многие другие вопросы, которые появились в результате моего поиска, говорили об этом)
P.P.S. - Мой полный источник
bar = \a b -> if (2^a) > b
then (a-1)
else bar (a+1) b
foo = bar 1
flrt :: Integer -> Integer
flrt = (floor . sqrt)
aks target = if (target < 2)
then putStr "Not a Prime.\n\n"
else if elem (mod target 10) [0,2,4,5,6,8]
then putStr "Composite\n\n"
else if (elem target) [a^b | a <- [3,5..(flrt target)], b <- [1.. (foo target)]]
then putStr "Composite\n\n"--}
else
putStr "filler"