我创建了这段代码,我需要在列表中找到只出现一次的元素 例如:对于输入[1,2,2,3,4,4],输出将为:[1,3]
unique :: =[a]->[a]
unique xs =[x|x<-xs, elemNum x xs ==1]
elemNum :: Int -> [Int]->[Int]
elemNum x (y:ys)
| x==y =1+ elemNum x ys
| otherwise =elemNum x ys
然而我收到一个错误: 不在范围内:“独特”
这是在Haskell中使用2函数的正确方法吗? (在同一个文件中定义它们),代码怎么了?
答案 0 :(得分:2)
您的代码中存在一些问题:
unique
的类型签名错误,应该是
unique ::(Eq a)=&gt; [a] - &gt; [α]
该类型约束(Eq a
)来自elemNum
elemNum
的类型签名也错了,应该是
elemNum ::(Eq a)=&gt; a - &gt; [a] - &gt; INT
该类型约束来自==
,其第一个参数的类型不必是Int
,但其返回类型应为Int
,因为您想知道有多少x
中的xs
。
此外,您忘记在该定义中处理空列表。
以下是您的代码的固定版本:
unique :: (Eq a) => [a] -> [a]
unique xs =[x| x<-xs, elemNum x xs == 1]
elemNum :: (Eq a) => a -> [a] -> Int
elemNum x [] = 0
elemNum x (y:ys)
| x==y = 1 + elemNum x ys
| otherwise = elemNum x ys
这是另一个实现:
onlyOnce [] = []
onlyOnce (x:xs)
| x `elem` xs = onlyOnce $ filter (/=x) xs
| otherwise = x : onlyOnce xs
如果x
中出现xs
,则onlyOnce (x:xs)
的结果应与将onlyOnce
应用于删除所有x
的结果的结果相同1}}来自xs
;否则,x
仅在(x:xs)
出现一次,因此x
应该是最终结果的一部分。
答案 1 :(得分:1)
unique
的类型声明中有一个等号:
unique :: =[a]->[a]
应该是
unique :: [a] -> [a]
答案 2 :(得分:1)
在我看来,使用Data.List
module:
import Data.List
unique :: (Ord a) => [a] -> [a]
unique = map (\(y,_) -> y) . filter (\(x,l) -> l == 1) . map (\l@(x:xs) -> (x,length l)) . group . sort