什么是落实在列表理解的哈斯克尔类似的功能在F#哈斯克尔列表综合卫士在F#
警卫例如方式:
factors :: Int -> [Int]
factors = [x | x <-[1 .. n], n 'mod' x == 0]
factors 15
[1,3,5,15]
和
posInt :: Int -> [Int]
posInt = [n | n > 0]
posInt 5
[5]
posInt 0
[]
什么是落实在列表理解的哈斯克尔类似的功能在F#哈斯克尔列表综合卫士在F#
警卫例如方式:
factors :: Int -> [Int]
factors = [x | x <-[1 .. n], n 'mod' x == 0]
factors 15
[1,3,5,15]
和
posInt :: Int -> [Int]
posInt = [n | n > 0]
posInt 5
[5]
posInt 0
[]
gradbot是正确的。忠实地转换posInt
会是什么样子:
let posInt n = [if n > 0 then yield n]
这将返回单个元素n的列表,如果它大于零。 – gradbot 2009-12-17 18:23:38
let factors n = [for x in 1 .. n do if n % x = 0 then yield x]
由于Kvb表明你可以使用没有序列的警卫。
let posInt n = [if n > 0 then yield n]
在一个侧面说明:
由于名单是不是在F#懒惰,你必须使用一个序列的无穷级数。
let posInfinite = seq {1 .. Int32.MaxValue}
你无法单独使用列表理解来创建一个增加整数的无限序列。你必须使用递归或其他内置函数展开。 .Net确实有一个称为BigInteger的任意长度的整数类型。您可以通过在整数上添加“I
”作为类型来使用它。这个例子将返回一个真正的无限序列的整数。
let posInfinite = Seq.unfold (fun i -> Some(i, i + 1I)) 1I
这个无限系列的例子并不是那么无限...... – 2009-12-17 17:53:51
那么,Seq.initInfinite返回int32作为构造函数的类型。 – gradbot 2009-12-17 18:01:00
int32被限制的事实并不意味着你不能创建一个无限列表:'seq {while true do yield 0}'是一个无限的0列表。 – 2009-12-17 18:03:06
查看答案
how do i translate this Haskell to F#?
该草图把Haskell的列表中理解到F#代码的一般方式。
(复制这里,以供参考:
更一般我认为Haskell的列表解析具有由下面的例子中所建议的形式,以及相应的F#被示
// Haskell
// [e(x,y) | x <- l1, y <- l2, pred(x,y)]
// F#
[for x in l1 do
for y in l2 do
if pred(x,y) then
yield e(x,y)]
)
能有用。 http://stackoverflow.com/questions/1888451/list-comprehension-in-f – gradbot 2009-12-17 17:41:39