小编use*_*438的帖子

F#filter函数 - 第一个参数的条件似乎是相反的

今天我对F#过滤功能有一点奇怪的体验.代码是:

let rec filter : ('a -> bool) -> 'a list -> 'a list =
    fun isKept -> function
        | [] -> []
        | (x::xs) -> if isKept x then x::filter isKept xs
                     else filter isKept xs

let x = filter ((>) 1) [1; -5; -20; 30; -35; 40]
Run Code Online (Sandbox Code Playgroud)

该代码返回

val x : int list = [-5; -20; -35]
Run Code Online (Sandbox Code Playgroud)

问题是,当我在第一个参数(> 1)中传递一个条件时,我希望它会过滤掉第二个参数的任何大于1的列表元素,而不是相反的.

有什么明显的东西我无法发现吗?

f# functional-programming

5
推荐指数
1
解决办法
255
查看次数

寻找算法寻求参数以满足给定函数的回报

我有这个特殊的问题,我还没有解决方案.我认为如果我知道它存在一个相关的算法会有所帮助.

我正在寻找的算法是帮助找到满足函数返回的目标的参数的算法.

例如,a works for b表示为(a,b)

Given: [ (a,b); (b,c) ]
Run Code Online (Sandbox Code Playgroud)

函数works将确保它们与布尔值的关系

let works a b -> true
let works b c -> true
Run Code Online (Sandbox Code Playgroud)

现在我得到了

[ (a, "x"); ("x", c) ]
Run Code Online (Sandbox Code Playgroud)

如果我想要这两个绑定是真的,那么这个函数必须为true

let works a "x" -> true
let works "x" c -> true
Run Code Online (Sandbox Code Playgroud)

现在我正在尝试编写一个帮助我实现这一目标的函数/算法 "x" = b

我在考虑回溯,但还不知道如何实现它.如果有人能给我提示,我将不胜感激.

作为旁注,我正在使用函数式编程范例在F#中实现该算法.

algorithm f# functional-programming prolog unification

5
推荐指数
1
解决办法
242
查看次数

F#删除数组中的某个元素

我查看了F#数组模块,但似乎没有可以从数组中删除某个元素的函数.我只是想知道是否存在任何功能呢?

例如

remove 2 [| 0 ; 1 ; 2 ; 3 ; 4 |]
val it -> [| 0 ; 1 ; 3 ; 4 |]
Run Code Online (Sandbox Code Playgroud)

UPDATE

阵列过滤器是我正在寻找的.除此之外,我的情况稍微具体一点.

如果我拥有的数组不是普通类型数组,而是特定类引用的数组.假设我只想删除其中的元素member.order = 2,那么谓词将如何?

f#

4
推荐指数
1
解决办法
4351
查看次数

F#检查变量是否属于子类型

要检查变量a是否有类型T,我可以使用

if (a :? T)
Run Code Online (Sandbox Code Playgroud)

但是,如果T是一个普遍定义的并且有几个子类型T1,T2,T3,我只关心它是否a有类型T1?例如:

type Uni = Iu of int
            | Flu of float
            | Su of string
            | Bu of bool
            | Lu of Uni List
            | Fu of (Uni -> Uni)
Run Code Online (Sandbox Code Playgroud)

如何检查变量aString是否具有类型Su

感谢帮助.

f#

2
推荐指数
1
解决办法
417
查看次数

F#检查2个地图是否相同

有没有简短的方法来检查2张地图是否相同?

例如

map [("a", 10)]
map [("a", 10)]
Run Code Online (Sandbox Code Playgroud)

- >相同

map [("b", 10)]
map [("b", 11)]
Run Code Online (Sandbox Code Playgroud)

- >不完全相同

f#

0
推荐指数
1
解决办法
100
查看次数