什麼是落實在列表理解的哈斯克爾類似的功能在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