В упражнении, которое я выполняю для курса функционального программирования, меня просят найти самый низкий x, для которого x mod a = b
, учитывая серию пар (a, b)
.
В случаекогда мне дают три пары (кортежи), я использую следующий код:
solveModularEq :: [(Integer,Integer)] -> Integer
solveModularEq [(a),(b),(c)] = lowestModThree(fst(a) snd(a) fst(b) snd(b) fst(c) snd(c) 1)
lowestModThree :: Integer -> Integer -> Integer -> Integer -> Integer ->
Integer -> Integer -> Integer
lowestModThree a b c aa bb cc k
| k `mod` a == aa && k `mod` b == bb && k `mod` c == cc = k
| k > (aa * bb * cc) = aa * bb * cc
| otherwise = lowestModThree a b c aa bb cc (k+1)
В случае, если такого x нет, вернуть произведение модулей.
Ошибки, которые я получаю, странные, потому что не похоже, что я не соответствую никаким типам.
modEq.hs:3:32:
Couldn't match expected type ‘Integer’
with actual type ‘Integer
-> Integer -> Integer -> Integer -> Integer -> Integer -> Integer’
Probable cause: ‘lowestModThree’ is applied to too few arguments
In the expression:
lowestModThree (fst (a) snd (a) fst (b) snd (b) fst (c) snd (c) 1)
In an equation for ‘solveModularEq’:
solveModularEq [(a), (b), (c)]
= lowestModThree
(fst (a) snd (a) fst (b) snd (b) fst (c) snd (c) 1)
modEq.hs:3:51:
Couldn't match type ‘Integer’
with ‘((a0, b0) -> b0)
-> (Integer, Integer)
-> ((a1, b1) -> a1)
-> (Integer, Integer)
-> ((a2, b2) -> b2)
-> (Integer, Integer)
-> ((a3, b3) -> a3)
-> (Integer, Integer)
-> ((a4, b4) -> b4)
-> (Integer, Integer)
-> Integer
-> Integer’
Expected type: (((a0, b0) -> b0)
-> (Integer, Integer)
-> ((a1, b1) -> a1)
-> (Integer, Integer)
-> ((a2, b2) -> b2)
-> (Integer, Integer)
-> ((a3, b3) -> a3)
-> (Integer, Integer)
-> ((a4, b4) -> b4)
-> (Integer, Integer)
-> Integer
-> Integer,
Integer)
Actual type: (Integer, Integer)
In the first argument of ‘fst’, namely ‘(a)’
In the first argument of ‘lowestModThree’, namely
‘(fst (a) snd (a) fst (b) snd (b) fst (c) snd (c) 1)’
То же самое происходит в моей реализации реализации рекурсивного теста на простоту.
isPrimeRec :: Int -> Bool
isPrimeRec n = isPrimeRec'(isqrt(n) n)
isPrimeRec' :: Int -> Int -> Bool
isPrimeRec' divisor n
| mod n divisor == 0 = isPrimeRec' (divisor-1) n
| mod n divisor /= 0 = False
| divisor < 2 = True
Ошибка для этого
palPrimes.hs:10:16:
Couldn't match expected type ‘Bool’ with actual type ‘Int -> Bool’
Probable cause: ‘isPrimeRec'’ is applied to too few arguments
In the expression: isPrimeRec' (isqrt (n) n)
In an equation for ‘isPrimeRec’:
isPrimeRec n = isPrimeRec' (isqrt (n) n)
palPrimes.hs:10:28:
Couldn't match expected type ‘Int -> Int’ with actual type ‘Int’
The function ‘isqrt’ is applied to two arguments,
but its type ‘Int -> Int’ has only one
In the first argument of ‘isPrimeRec'’, namely ‘(isqrt (n) n)’
In the expression: isPrimeRec' (isqrt (n) n)