我想创建一个Haskell函数,该函数打印列表的前缀:
该函数应执行以下操作:
> prefixes "123"
["","1","12"]
> prefixes "1"
[""]
我写了以下代码:
prefixes :: [a] -> [[a]]
prefixes [] = []:[]
prefixes f = f : prefixes(init(f))
该功能将输入的字符串或字符作为前缀打印,并以相反的方向打印。我想删除它,所以当我输入“ 123”时,它应该如上打印并以正确的方向显示。
我们可以使用:
reverse (drop 1 f)
命令,但是我不知道如何在我的函数中实现它。
您能帮我解决这个问题,以便它正确打印吗?
答案 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 1
是tail
$
代替,以提高可读性。答案 2 :(得分:0)
这是一种无点式的解决方案:
prefixes = foldr (\el acc -> [] : map (el:) acc) []