Haskell 具有不同参数的类型签名

Haskell type signatures with varying parameters

欧拉计划 #4:回文数在两种情况下的读法相同。两个2位数乘积的最大回文数是9009 = 91 × 99。求两个3位数乘积的最大回文数

此解决方案有效:

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

You have a typo. [Should] be (Eq a) =>... (arrow should be made with equal sign) – Michal Seweryn

Class 约束与它们用 => 约束的类型分开。