Подписи типа Haskell с различными параметрами

Проект Эйлера № 4: палиндромное число одинаково читается в обоих случаях. Самый большой палиндром, составленный из произведения двух двузначных чисел, равен 9009 = 91 × 99. Найдите наибольший палиндром, составленный из произведения двух трехзначных чисел.

Это решение работает:

p004largestPalindrome :: Integer
p004largestPalindrome = largest [ a * b | a <- [100..999], b <- [100..999], isPalindrome $ show(a*b) ]
    where
        isPalindrome [] = True
        isPalindrome [_] = True
        isPalindrome (x:xs) = if x == last xs then isPalindrome (init xs) else False
        largest [] = 0
        largest [x] = x
        largest (x:xs) = if x > head xs then largest (x:(tail xs)) else largest xs 

Мой вопрос: можете ли вы назначить сигнатуры типов функциям в предложении where, учитывая, что обе они имеют разное расположение параметров ([], [x], (x:xs))? Втыкание isPalindrome :: (Eq a) -> [a] -> Bool выдает ошибку.

Изменить: я пытаюсь вставить подпись типа так:

p004largestPalindrome :: Integer
p004largestPalindrome = largest [ a * b | a <- [100..999], b <- [100..999], isPalindrome $ show(a*b) ]
    where
        isPalindrome :: (Eq a) -> [a] -> Bool
        isPalindrome [] = True
        isPalindrome [_] = True
        isPalindrome (x:xs) = if x == last xs then isPalindrome (init xs) else False
        largest [] = 0
        largest [x] = x
        largest (x:xs) = if x > head xs then largest (x:(tail xs)) else largest xs

person Mark Karavan    schedule 20.01.2015    source источник
comment
Куда именно ты это втыкал?   -  person jwodder    schedule 20.01.2015
comment
прямо перед isPalindrome [] = True, прямо под where   -  person Mark Karavan    schedule 20.01.2015
comment
У вас опечатка. Обута должна быть (Eq a) =>... (стрелка должна быть сделана со знаком равенства)   -  person Michal Seweryn    schedule 20.01.2015
comment
Это сработало. Как и largest :: (Ord a) => [a] -> a   -  person Mark Karavan    schedule 20.01.2015
comment
Кстати, isPalindrome имеет квадратичную сложность, тогда как более простая \x -> x == reverse x имеет линейную сложность. Это не имеет большого значения, поскольку у нас, конечно, есть только короткие входы.   -  person chi    schedule 20.01.2015


Ответы (1)


У вас опечатка. [Должно] быть (Eq a) =>... (стрелка должна быть сделана со знаком равенства) — Михал Северин

Ограничения класса отделены от типов, которые они ограничивают, с помощью =>.

person Community    schedule 20.01.2015
comment
Это сработало. Как и largest :: (Ord a) => [a] -> a - person Mark Karavan; 20.01.2015