2009-05-14 7 views
4

J'essaie d'apprendre F # en traduisant du code Haskell que j'ai écrit il y a très longtemps, mais je suis bloqué!comment est-ce que je traduis ce Haskell en 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']] 

J'ai réussi ceci:

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

bien que je ne aime pas avoir à avoir. après le 100.

Quel est le nom de l'opération que j'effectue dans freqs, et comment puis-je le traduire en F #?

Edit: count et lowers sont respectivement Char -> String -> Int et String -> Int, et je l'ai déjà traduit ces.

Merci

Répondre

13

Ceci est une compréhension de la liste, et en F # il semble que les deux dernières lignes ci-dessous:

// 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)] 

Plus généralement je pense que la liste Haskell compréhensions ont la forme suggérée par l'exemple ci-dessous, et le F # correspondant est montré.

// 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

Merci :) juste ce que je avais besoin –

0

Notez que F le code # Brian:

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

peut être écrit de manière plus élégante que:

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