gpt4 book ai didi

F# 过滤器函数 - 第一个参数的条件似乎颠倒了

转载 作者:行者123 更新时间:2023-12-04 18:43:49 24 4
gpt4 key购买 nike

我今天对 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]

该代码返回
val x : int list = [-5; -20; -35]

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

有什么明显我看不到的东西吗?

最佳答案

你的过滤功能很好。问题是这行代码:

let x = filter ((>) 1) [1; -5; -20; 30; -35; 40]

如果您使用显式 lambda 而不是部分应用 (>),则等效于此代码运算符(operator):
let x = filter (fun x -> 1 > x) [1; -5; -20; 30; -35; 40]

造成这种情况的原因是 (>)函数接受两个参数;即使 1出现在 (>) 的右侧,它不会作为“正确”参数传递给函数。解决方案是使用 (<)反而:
> let x = filter ((<) 1) [1; -5; -20; 30; -35; 40];;

val x : int list = [30; 40]

或者使用显式 lambda 函数来确保您以正确的顺序应用参数:
> let x = filter (fun x -> x > 1) [1; -5; -20; 30; -35; 40];;

val x : int list = [30; 40]

关于F# 过滤器函数 - 第一个参数的条件似乎颠倒了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18673632/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com