在 Haskell 中创建一个检查字谜的函数

Posted

技术标签:

【中文标题】在 Haskell 中创建一个检查字谜的函数【英文标题】:Creating a function for checking anagrams in Haskell 【发布时间】:2018-03-22 09:00:28 【问题描述】:

所以我正在尝试创建一个函数,该函数接受单词列表并在新列表中返回字谜。这是我目前所拥有的:

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 的新手,所以请放轻松。

【问题讨论】:

尝试向您的函数添加显式类型签名。 GHC 的错误消息应该(希望)帮助您找到代码的问题。此外,在 Haskell 中,您可以编写一个带有 2 个参数 (f :: (a, b) -&gt; c) 的函数作为柯里化函数 (f :: a -&gt; b -&gt; c) 【参考方案1】:

美好的开始!

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

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

-- change two
listana [] = []

那里有许多可用的改进。我鼓励您浏览Data.List 模块,看看那里实现的任何功能是否有用。还有一个标准技巧,使用Data.Map 将项目组合在一起,使其成为单线;请参阅 another answer of mine 以获取提示。

【讨论】:

以上是关于在 Haskell 中创建一个检查字谜的函数的主要内容,如果未能解决你的问题,请参考以下文章

在 Haskell 中创建自定义标志

如何在 javascript 中创建一个单词的所有可能字谜的列表?

在这个 javascript 字谜问题中,我一直在变得虚假而不是真实

Rails:在父模型的视图中创建一个 has_one 模型?

如何实现我的字谜和回文函数来检查用户输入的单词?

Haskell 2-3-4 树