Проект Эйлера № 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
isPalindrome [] = True
, прямо подwhere
- person Mark Karavan   schedule 20.01.2015(Eq a) =>...
(стрелка должна быть сделана со знаком равенства) - person Michal Seweryn   schedule 20.01.2015largest :: (Ord a) => [a] -> a
- person Mark Karavan   schedule 20.01.2015isPalindrome
имеет квадратичную сложность, тогда как более простая\x -> x == reverse x
имеет линейную сложность. Это не имеет большого значения, поскольку у нас, конечно, есть только короткие входы. - person chi   schedule 20.01.2015