Как перевести этот Haskell на F #?

Я пытаюсь изучить F #, переведя некоторый код Haskell, который я написал очень давно, но я застрял!

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 #?

Изменить: count и lowers соответствуют Char -> String -> Int и String -> Int соответственно, и я уже перевел их.

Спасибо

Ответы

Ответ 1

Это понимание списка, а в F # оно выглядит как последние две строки ниже:

// stub out since dunno 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)]

Ответ 2

Обратите внимание, что код Брайана 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)]