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 约束与它们用 =>
约束的类型分开。
欧拉计划 #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 约束与它们用 =>
约束的类型分开。