在Haskell中一起使用少量函数

时间:2014-05-03 13:45:01

标签: haskell

我创建了这段代码,我需要在列表中找到只出现一次的元素 例如:对于输入[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函数的正确方法吗? (在同一个文件中定义它们),代码怎么了?

3 个答案:

答案 0 :(得分:2)

您的代码中存在一些问题:

  1. unique的类型签名错误,应该是

    unique ::(Eq a)=&gt; [a] - &gt; [α]

    该类型约束(Eq a)来自elemNum

  2. elemNum的类型签名也错了,应该是

    elemNum ::(Eq a)=&gt; a - &gt; [a] - &gt; INT

    该类型约束来自==,其第一个参数的类型不必是Int,但其返回类型应为Int,因为您想知道有多少x中的xs

    此外,您忘记在该定义中处理空列表。

  3. 以下是您的代码的固定版本:

    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