过滤最大值N.

时间:2018-05-23 16:54:42

标签: recursion filtering purely-functional anura ffl

是否有可能在FFL中写入export interface IToDoList { ID: number, Comment: string, isEditable: boolean } 版本,在第一次否定匹配后停止过滤,即其余项目被假定为正匹配?更一般地说,过滤器。

示例:

filter

预期结果:

  

[1,3,4]

这似乎很难用纯粹的功能风格来写。也许递归或filterMaxOf1([1,2,3,4], value<2) 可以实现它?

注意:这个问题的全部动机是对微观优化的假设。所以表现非常重要。我也在寻找通常适用于任何数据类型的内容,而不仅仅是let

2 个答案:

答案 0 :(得分:1)

当然递归可以! :d

filterMaxOf1(input, target)
where filterMaxOf1 = def
        ([int] l, function f) -> [int]
        if(size(l) = 0,
                [],
                if(not f(l[0]),
                        l[1:],
                        flatten([
                                l[0],
                                recurse(l[1:], f)
                        ])
                )
        )
where input = [
        1, 2, 3, 4, ]
where target = def
        (int i) -> bool
        i < 2

一些检查:

--> filterOfMax1([1, ]) where filterOfMax1 = [...]
[1]
--> filterOfMax1([2, ]) where filterOfMax1 = [...]
[]
--> filterOfMax1([1, 2, ]) where filterOfMax1 = [...]
[1]
--> filterOfMax1([1, 2, 3, 4, ]) where filterOfMax1 = [...]
[1, 3, 4]

这种味道失去了一些强大的类型安全性,但更接近尾部递归:

filterMaxOf1(input, target)
where filterMaxOf1 = def
        ([int] l, function f) -> [int]
        flatten(filterMaxOf1i(l, f))
where filterMaxOf1i = def
        ([int] l, function f) -> [any]
        if(size(l) = 0,
                [],
                if(not f(l[0]),
                        l[1:],
                        [
                                l[0],
                                recurse(l[1:], f)
                        ]
                )
        )
where input = [
        1, 2, 3, 4, ]
where target = def
        (int i) -> bool
        i < 2

答案 1 :(得分:1)

我最近在引擎中添加了find_index,这样可以轻松完成:

if(n = -1, [], list[:n] + list[n+1:])
where n = find_index(list, value<2)
where list = [1,2,3,4]

find_index将返回第一个匹配的索引,如果未找到匹配则返回-1。还有find_index_or_die返回第一个匹配的索引,如果没有找到,则确定是否确定列表中有实例。

你也可以使用递归来实现这样的东西:

def filterMaxOf1(list ls, function(list)->bool pred, list result=[]) ->list
base ls = []: result
base not pred(ls[0]): result + ls[1:]
recursive: filterMaxOf1(ls[1:], pred, result + [ls[0]])