2009-05-14 4 views
4

Ich versuche F # zu lernen, indem ich einen Haskell-Code übersetze, den ich vor sehr langer Zeit geschrieben habe, aber ich stecke fest!Wie übersetze ich dieses Haskell zu 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']] 

Ich habe das geschafft:

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

obwohl ich das haben nicht dergleichen. nach dem 100.

Wie lautet der Name des Vorgangs, den ich in freqs ausführe, und wie übersetze ich es in F #?

Edit: count und lowers sind Char -> String -> Int und String -> Int sind, und ich habe diese bereits übersetzt.

Dank

Antwort

13

Dies ist eine Liste Verständnis, und in F # sieht es aus wie die letzten beiden Zeilen unter:

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

Allgemeiner denke ich Haskell Listenkomprehensionen das Formular unten am Beispiel vorgeschlagen haben und die entsprechende F # wird angezeigt.

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

Thanks :) genau das, was ich brauchte:

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

Kann elegant wie geschrieben mehr werden –

0

Beachten Sie, dass Brians F # Code:

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