如何将这个Haskell代码翻译成F#?

3

我正在尝试通过翻译我很久以前写的一些Haskell代码来学习F#,但是我卡住了!

percent       :: Int -> Int -> Float
percent a b    = (fromInt a / fromInt b) * 100

freqs         :: String -> [Float]
freqs ws       = [percent (count x ws) (lowers ws) | x <- ['a' .. 'z']]

我已经管理好了这个:

let percent a b = (float a / float b) * 100.

虽然我不喜欢在100后面加上“.”。

我在freqs中执行的操作叫什么名字,如何将其翻译成F#?

编辑:countlowers分别是Char -> String -> IntString -> Int,我已经将它们翻译过了。

2个回答

13
这是一个列表推导式,在 F# 中它看起来像下面的最后两行代码:
// stub out since don't know the implementation
let count (c:char) (s:string) = 4
let lowers (s:string) = 10
// your code
let percent a b = (float a / float b) * 100.
let freq ws = [for x in ['a'..'z'] do 
                   yield percent (count x ws) (lowers ws)]

更一般地说,我认为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)]

0
请注意Brian的F#代码:
let freq ws = [for x in ['a'..'z'] do yield percent (count x ws) (lowers ws)]

可以更优雅地编写为:

let freq ws = [for x in 'a'..'z' -> percent (count x ws) (lowers ws)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接