Fask中的Haskell列表理解保护

时间:2009-12-17 17:35:03

标签: haskell f# list-comprehension

在F#中使用警卫在列表推导的Haskell中实现类似功能的方法是什么?

例如:

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
[]

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

gradbot是对的。忠实地转换posInt看起来像:

let posInt n = [if n > 0 then yield n]

答案 2 :(得分:4)

的答案

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)]