Как я могу перевести этот 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 соответственно и я уже перевел это.

Спасибо

2 ответа

Решение

Это понимание списка, а в 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)]

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