Haskell中适当的前缀功能

时间:2018-10-08 07:45:36

标签: haskell

我想创建一个Haskell函数,该函数打印列表的前缀:

该函数应执行以下操作:

> prefixes "123"
["","1","12"]
> prefixes "1"
[""]

我写了以下代码:

prefixes :: [a] -> [[a]]
prefixes [] = []:[]
prefixes f =  f : prefixes(init(f)) 

该功能将输入的字符串或字符作为前缀打印,并以相反的方向打印。我想删除它,所以当我输入“ 123”时,它应该如上打印并以正确的方向显示。

我们可以使用:

reverse (drop 1 f)

命令,但是我不知道如何在我的函数中实现它。

您能帮我解决这个问题,以便它正确打印吗?

3 个答案:

答案 0 :(得分:6)

您的基本情况不正确,空列表没有适当的前缀。因此,很明显,在基本情况下,必须返回空列表才能使函数正确。

现在考虑递归情况。例如,它应该始终以空列表开头(因为public class Foo { public int Id { get; set; } public string Bar { get; set; } public string FooBar { get; set; } public string Fizz { get; set; } public string Buzz { get; set; } public static Foo Create(int id, string property, string value) { return new Foo { WebshopCustomerId = webshopCustomerId, Bar = (typeof(Foo)).GetProperty(property).Name == "Bar" ? value : null, FooBar = (typeof(Foo)).GetProperty(property).Name == "FooBar" ? value : null, Fizz = (typeof(Foo)).GetProperty(property).Name == "Fizz" ? value : null, Buzz = (typeof(Foo)).GetProperty(property).Name == "Buzz" ? value : null, }; } } 的前缀始终为(x:xs))。我们如何构造列表的其余部分([[],...]的非空前缀?

我们要使用递归,那么如何从(x:xs)的适当前缀集中构建(x:xs)的非空适当前缀呢?以您的示例xs为例,"123"的前缀为"23",我们要构造的非空前缀为["", "2"],因此我们只需添加["1","12"]尾部每个前缀的头部。

因此,在递归的情况下:空列表是一个适当的前缀,并且列表的头部也添加到了尾部的任何适当的前缀。

这是一段满足您需求的代码:

'1'

答案 1 :(得分:0)

您似乎想知道如何定义一个将调用原始定义的辅助函数。

prefixes xs = reverse (drop 1 (prefixes' xs)) where
    prefixes' [] = []:[]
    prefixes' f =  f : prefixes' (init(f)) 

您的原始定义虽然看似可行,但次优。另一个答案显示了如何更直观地做到这一点,并且不需要帮助函数(编辑:但是性能可能不好,也可能不好)。此功能还有其他一些小地方可以改进:

  • []:[]可以简单地写为[[]]
  • drop 1tail
  • 括号通常可以用函数组合和$代替,以提高可读性。

答案 2 :(得分:0)

这是一种无点式的解决方案:

prefixes = foldr (\el acc -> [] : map (el:) acc) []