Не удается понять ошибку «Невозможно построить бесконечный тип» - PullRequest
1 голос
/ 18 июня 2020

Я пытаюсь решить проблему с HackerRank и получаю сообщение об ошибке, которое не могу понять. Проблема в функции solve1. Точная ошибка: cannot construct the infinite type a ~ t0 a. Expected type ([t0 a], [t0 a], [t0 a]) Actual type ([a], [a], [a]). In the second argument of `tripleMap`, namely '(tripList xs)'.

Я продолжаю смотреть на типы, и они продолжают казаться мне правильными. tripList берет список чисел и возвращает тройку списков чисел. tripleMap принимает тройку списков чисел в качестве второго аргумента.

При тестировании tripList в моем REPL я получаю желаемые результаты:

> tripList [1,0,-1,0,1] 
([1,1],[0,0],[-1])

Вот мой код:

length' :: (Foldable t, Num b, Fractional b, Ord b) => t a -> b
length' = foldr (\_ acc -> 1 + acc) 0

tripList :: (Num a, Ord a) => [a] -> ([a], [a], [a])
tripList xs =
  ( filter (>0) xs
  , filter (==0) xs
  , filter (<0) xs )

foldSolution :: (Foldable t, Num a, Ord a, Fractional a)
             => a -> t a -> a
foldSolution n = foldr (\x y -> x/n + y/n) 0

tripleMap :: (a -> b) -> ([a], [a], [a]) -> ([b], [b], [b])
tripleMap f (a, b, c) = (map f a, map f b, map f c)

solve1 :: (Num a, Ord a) => [a] -> ([a], [a], [a])
solve1 xs = tripleMap (foldSolution (length' xs)) (tripList xs)

1 Ответ

5 голосов
/ 18 июня 2020

Ваш foldSolution (length' xs) принимает t a и возвращает a. Итак, когда вы tripleMap это на tripList xs (который имеет тип ([a], [a], [a])), вы получаете кортеж типа (a, a, a), а не ([a], [a], [a]), поэтому вы получили ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...