\\
F# 中是否有与 Haskell 的列表差分运算符等效的运算符?
fryguybob
问问题
2000 次
5 回答
5
不...只需编写它并使其成为中缀运算符-使用一组特殊字符。反斜杠 ( \
) 不在下面的列表中,因此它不能用作中缀运算符。请参阅手册:
中缀操作:=
or || & && <OP >OP $OP = |OP &OP ^OP :: -OP +OP *OP /OP %OP **OP
前缀操作:=
!OP ?OP ~OP -OP +OP % %% & &&
于 2008-09-12T19:41:25.393 回答
5
被退回,但我相信值得在这里写下( /-/ )
(Haskell 的 F# 版本\\
)的实现:
let flip f x y = f y x
let rec delete x = function
| [] -> []
| h :: t when x = h -> t
| h :: t -> h :: delete x t
let inline ( /-/ ) xs ys = List.fold (flip delete) xs ys
这将像 Haskell 一样运行\\
,因此(xs @ ys) /-/ xs = ys
. 例如:(7 :: [1 .. 5] @ [5 .. 11]) /-/ [4 .. 7]
计算为[1; 2; 3; 5; 7; 8; 9; 10; 11]
.
于 2012-09-15T08:27:37.520 回答
2
从减数集中过滤项目:
let ( /-/ ) xs ys =
let ySet = set ys
let notInYSet x = not <| Set.contains x ySet
List.filter notInYSet xs
于 2011-05-22T00:29:08.330 回答
1
我正在使用这个:
let (/-/) l1 l2 = List.filter (fun i -> not <| List.exists ((=) i) l2) l1
如果有人看到问题,请告诉我。
用于列表,因此结果中可能存在重复。例如:
[1;1;2] /-/ [2;3] would be eq to [1;1]
于 2015-01-15T00:58:16.397 回答
-2
假设您真的想要传统的集合差异而不是 Haskell 显然提供的奇怪的有序但未排序的多重减法,只需使用内置set
函数将列表转换为集合,然后使用内置-
运算符来计算集合差异:
set xs - set ys
例如:
> set [1..5] - set [2..4];;
val it : Set<int> = seq [1; 5]
于 2009-05-06T02:29:13.457 回答