F#:如何使用过滤谓词计算子集?

时间:2016-02-02 07:27:29

标签: filter f# set seq

E.g。 对于1到10之间的整数,请选择3个数字:

1. Sum of these 3 numbers equals to 24
2. These 3 numbers could build a right triangle.

如何使用F#获取这3个数字? 我知道Haskell非常简单:

Prelude> let rightTriangle=[(a,b,c)|c<-[1..10],a<-[1..c],b<-[1..a],a^2+b^2==c^2,a+b+c==24]
Prelude> rightTriangle

解决方案是

[(8,6,10)]

我不确定是否

F# could help to generate a Cartesian product conveniently?
F# could add different filter conditions inside one expression?

那么,如何用F#方便地实现呢? 感谢。

1 个答案:

答案 0 :(得分:1)

F#中Haskell版本的直接等价物是使用列表推导:

let rightTriangle=
  [for c in 1 .. 10 do
   for a in 1 .. c do
   for b in 1 .. a do
     if pown a 2 + pown b 2 = pown c 2 && a + b + c = 24 then
       yield a, b, c ]

一般来说,F#理解更接近于“普通F#语言”,而不是一种特殊的语言特征(如果你放弃[ .. ],它看起来几乎就像使用命令式迭代一样循环)。

  • for构造对应a <- 1 .. 10,但如果要绑定多个变量,则需要嵌套多个fors
  • if构造对应于使用Haskell中的==位进行过滤
  • yield指定应从列表理解
  • 返回的值