Haskell 挣扎着去理解一句话;无法构造无限类型";错误

Haskell 挣扎着去理解一句话;无法构造无限类型";错误,haskell,Haskell,我试图解决一个黑客银行的问题,但我遇到了一个我无法理解的错误。问题出现在solve1功能中。确切的错误是:无法构造无限类型a~t0a。预期类型([T0A]、[T0A]、[T0A])实际类型([a]、[a]、[a])。在“tripleMap”的第二个参数中,即“(TripleList xs) 我一直在看这些类型,它们在我眼中依然正确三元组列表获取数字列表并返回数字列表的三元组tripleMap将三个数字列表作为其第二个参数 在测试我的REPL中的三元组时,我得到了期望的结果: > tripL

我试图解决一个黑客银行的问题,但我遇到了一个我无法理解的错误。问题出现在
solve1
功能中。确切的错误是:
无法构造无限类型a~t0a。预期类型([T0A]、[T0A]、[T0A])实际类型([a]、[a]、[a])。在“tripleMap”的第二个参数中,即“(TripleList xs)

我一直在看这些类型,它们在我眼中依然正确<代码>三元组列表获取数字列表并返回数字列表的三元组
tripleMap
将三个数字列表作为其第二个参数

在测试我的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)
length'::(可折叠的t,Num b,分数b,Ord b)=>ta->b
长度'=foldr(\\uACC->1+acc)0
三元组::(数字a,单词a)=>[a]->([a],[a],[a])
三列表xs=
(过滤器(>0)xs
,过滤器(=0)xs
,过滤器(a->t a->a
foldSolution n=foldr(\x y->x/n+y/n)0
三重映射::(a->b)->([a],[a],[a])->([b],[b],[b])
三重映射f(a,b,c)=(映射f a,映射f b,映射f c)
解决方案1::(数量a,顺序a)=>[a]->([a],[a],[a])
solve1 xs=tripleMap(foldSolution(长度'xs))(三元组xs)
您的
折叠解决方案(长度'xs)
接受
ta
并返回
a
。因此,当您在
三列表xs
上对其进行
映射时(其类型为
([a],[a],[a])
,您会得到类型为
(a,a,a)
,而不是
([a],[a])
,这就是你出错的原因。

你的
折叠解决方案(长度'xs)
接受
ta
并返回
a
。因此,当你在
三行xs
(类型为
([a],[a],[a])
,你会得到一个
(a,a,a)类型的元组,而不是
([a],[a],[a])
,这就是您出现错误的原因