了解Haskell中的列表

时间:2014-12-16 22:09:07

标签: haskell ghci

请原谅我的简单大脑,但我无法理解Haskell,尤其是列表。我试图编写一个函数来返回指定长度的所有子串n,(每次从原始字符串的长度开始调用该函数时,这将减少一个 - 1)字符串(不导入模块)。我写了以下代码

allSubs :: Int -> Int -> String -> [String]
allSubs x n s
    |n > x      = (take n (drop x (tail s))) : allSubs (x+1) n s

无论多么有缺陷,我都不期待我的代码的逻辑或稳健性方面的帮助。但是我想知道是否有任何列表被创建。我之前只用C编码,我可以输入

else { return listx }

或者什么,但在这种情况下,列表的名称是什么?如果我想在另一个函数中使用该列表,例如,如果我想使用函数findRep在列表中找到重复的字符串,我可以写

    |otherwise  = findRep list

非常感谢任何建议。

1 个答案:

答案 0 :(得分:1)

概念:

all substrings of (x:xs) = (all substrings beginning at position 0) ++ 
                           (all substrings of xs)

因此涉及两个函数:“所有子串”和“从位置0开始的所有子串”。我们称他们为allsubspos0

现在考虑如何递归定义{{​​1}}:

  • 对于空字符串,从位置0开始的唯一子字符串是空字符串
  • 对于pos0,我们可以使用空字符串,也可以让(x:xs)成为ys的成员,并将pos0 xs添加到其中

现在您只需将此规范转换为Haskell。

全部放在一起:

x