繁体   English   中英

具有不同参数的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 

我的问题是:鉴于两者都有不同的参数排列方式[[],[x],(x:xs)),您可以为where子句中的函数分配类型签名吗? 坚持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

你有错字 [应该] (Eq a) =>... (箭头应带有等号)– Michal Seweryn

类约束与其使用=>约束的类型分开。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM