2015-01-20 4 views
0

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

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

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, учитывая, что оба имеют различные механизмы параметров ([], [х], (х: хз))? Замедление в isPalindrome :: (Eq a) -> [a] -> Bool вызывает ошибку.

Edit: Я пытаюсь вставить подпись типа так:

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 
+0

Где именно вы это придерживались? – jwodder

+0

прямо перед 'isPalindrome [] = True', прямо под' where' –

+3

У вас есть опечатка. Shod be '(Eq a) => ...' (стрелка должна быть сделана с равным знаком) –

ответ

4

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

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

+0

Это сработало. Так делает 'наибольший :: (Ord a) => [a] -> a' –