составление floor и sqrt на хаскеле

Я просто изучаю 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"
5
задан Chris Snow 31 December 2016 в 14:15
поделиться