繁体   English   中英

Haskell“无法将预期类型“ a”与实际类型“ [a0]”匹配”

[英]Haskell “Couldn't match expected type ‘a’ with actual type ‘[a0]’”

我在Haskell做一个项目,试图在该项目中创建一个接受两个列表输入的函数,然后返回列表的并集,但没有重复项。

问题是我不断收到错误消息:

Couldn't match expected type ‘a’ with actual type ‘[t0]’
      ‘a’ is a rigid type variable bound by
          the type signature for newList :: [a] -> [a] -> [a]

这是我的代码:

allList :: (Eq a) => [a] -> [a] -> [a]
allList [] [] = []
allList x y = (x ++ y)

checkDup [] = []
checkDup (z:zs)
    | z `elem` zs = checkDup zs
    | otherwise = z : checkDup zs

newList :: (Eq a) => [a] -> [a] -> [a]
newList [] [] = []
newList x y = [checkDup z | z <- allList x y]

第一个allList函数创建两个列表的列表, checkDup创建一个没有任何重复的新列表, newList使用列表理解将组合列表传递给checkDup

有人知道我要去哪里错吗?

问题出在这里:

newList x y = [checkDup z | z <- allList x y]

z应该是您传递给checkDup的列表,但是在这种情况下, z只是单个元素

也许你想要:

newList x y = checkDup $ allList x y

newList可以声明如下:

newList :: (Eq a) => [a] -> [a] -> [a]
newList = checkDup . allList

由于@ Smac89回答了您的问题,为什么不使用Data.Set这样的数据表示Data.Set

import qualified Data.Set as S

allList :: Ord a => [a] -> [a] -> [a]
allList xs ys = S.toList $ S.union (S.fromList xs) (S.fromList ys)

(尽管继续使用Set可能更有意义。)

或使用Data.List

import Data.List

newList :: Eq a => [a] -> [a] -> [a]
newList xs ys = nub $ xs ++ ys

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM