【问题标题】:F#: how to calculate a subset using filtering predicate?F#:如何使用过滤谓词计算子集?
【发布时间】:2016-02-02 07:27:28
【问题描述】:

例如 对于 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# 实现呢? 谢谢。

【问题讨论】:

  • 在此处查找 F# 笛卡尔积。然后使用 List.filter
  • 这是一个sample code,类似于使用 FsControl 的 Haskell 解决方案。
  • 另外,到底是什么问题——我们不是免费的haskell——> F#翻译服务
  • 您尝试的解决方案在哪里?

标签: filter f# set seq


【解决方案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 &lt;- 1 .. 10,但是要绑定多个变量需要嵌套多个fors
  • if 构造对应于在 Haskell 中使用 == 位的过滤
  • yield 指定应该从列表理解中返回哪些值

【讨论】:

  • 所以你的意思是,F# 推导式不像 Haskell 那样强大和方便(从数学的角度来看)?那么 F# 相对于 Haskell 的优势是什么,除了它是建立在 .net 上并与 C# 一起工作的吗? F# 与 Haskell 相比的其他优势?谢谢。
猜你喜欢
  • 2014-10-26
  • 1970-01-01
  • 1970-01-01
  • 2015-01-16
  • 2020-05-20
  • 1970-01-01
  • 2010-09-12
  • 1970-01-01
相关资源
最近更新 更多