Как я могу перевести этот Haskell на F #? - PullRequest
4 голосов
/ 14 мая 2009

Я пытаюсь выучить 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 ]

13 голосов
/ 14 мая 2009

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

В более общем смысле, я думаю, что представления списка Хаскелла имеют форму, предложенную в приведенном ниже примере, и показан соответствующий 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 голосов
/ 15 июня 2012

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