今天我对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的列表元素,而不是相反的.
有什么明显的东西我无法发现吗?
我有这个特殊的问题,我还没有解决方案.我认为如果我知道它存在一个相关的算法会有所帮助.
我正在寻找的算法是帮助找到满足函数返回的目标的参数的算法.
例如,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#中实现该算法.
我查看了F#数组模块,但似乎没有可以从数组中删除某个元素的函数.我只是想知道是否存在任何功能呢?
例如
remove 2 [| 0 ; 1 ; 2 ; 3 ; 4 |]
val it -> [| 0 ; 1 ; 3 ; 4 |]
Run Code Online (Sandbox Code Playgroud)
UPDATE
阵列过滤器是我正在寻找的.除此之外,我的情况稍微具体一点.
如果我拥有的数组不是普通类型数组,而是特定类引用的数组.假设我只想删除其中的元素member.order = 2,那么谓词将如何?
要检查变量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?
感谢帮助.
有没有简短的方法来检查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)
- >不完全相同