Как перевести этот 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)]