2017-10-10 122 views
0

所以我试图创建一个函数,它接受一个单词列表并返回新列表中的字母。这是我到目前为止:在Haskell中创建一个检查字符的函数

quicksort :: Ord a => [a] -> [a] 
quicksort []  = [] 
quicksort (p:xs) = (quicksort lesser) ++ [p] ++ (quicksort greater) 
    where 
     lesser = filter (< p) xs 
     greater = filter (>= p) xs 

sub(a,[]) = [] 
sub(a,b:c) = if a == b then c else b:(sub(a,c)) 

sublist([],a) = a 
sublist(a:b,c) = sublist(b,sub(a,c)) 

anagram a b = quicksort (a) == quicksort (b) 

find a,[] = nil 
find (a, b:c) = if anagram a b then b:(find(a,c)) else find(a,c) 

listana [] = nil 
listana (a:c) = list:(listana(sublist(list,a:c))) 
       where list = a:(find(a,c)) 

我很确定有一个问题,我的查找功能。 哦,我是Haskell的新手,所以请放轻松点。

+0

尝试添加显式类型签名到您的函数。 GHC的错误信息应该(希望)帮助你找到你的代码的问题。另外,在Haskell中,你可以用一个带有2个参数('f ::(a,b) - > c')的函数作为curried函数('f :: a - > b - > c') – cdk

回答

1

好的开始!

进行此编译所需的最小更改是将nil替换为[],并将参数的括号包围为find。所以:

-- change one 
find (a,[]) = [] 

-- change two 
listana [] = [] 

这里有很多改进。我鼓励你浏览Data.List模块,看看那里实现的任何功能是否有用。还有一个标准的技巧,使用Data.Map将这些内容组合在一起;请参阅another answer of mine以获得提示。

相关问题