Не удалось сопоставить тип Integer в Haskell - PullRequest
0 голосов
/ 25 сентября 2018

В упражнении, которое я выполняю для курса функционального программирования, меня просят найти самый низкий 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)

1 Ответ

0 голосов
/ 25 сентября 2018

Синтаксис для применения функции f к аргументу x: f x, а не f(x).Приложения ассоциируются слева, поэтому f x y означает (f x) y, то есть примените f к x и примените результирующую функцию к y.Если x само по себе является сложным выражением с приложениями функций в нем, вы можете использовать дополнительные скобки для устранения неоднозначности;так, например:

  • a b c d применяет функцию a к аргументам b, c и d
  • a (b c) d применяет функцию aк аргументам b c и d
  • a b (c d) применяет функцию a к аргументам b и c d
  • a (b c d) применяет функцию a к одному аргументу, b c d
...