2017-02-17 37 views
5

Sadece F # öğrenmeye başladım ve e için Taylor serisinin ilk 10 şartını oluşturmaya ve değerlendirmeye çalışıyorum.'Float -> float' türü 'float' türüyle eşleşmiyor

let fact n = function 
    | 0 -> 1 
    | _ -> [1 .. n] |> List.reduce (*) 

let taylor e = 
    let term n = (e ** n)/(fact n) 
    [1 .. 10] 
     |> List.map (term) 
     |> List.reduce (+) 

** operatör int için çalışmıyor Bir hata nedeniyle yol açar: başlangıçta bunu hesaplamak için bu kodu yazdım. Açıkçası her şeyin düzgün çalışması için her şeyi float'a dökmem gerekiyor. Yani:

derleyici hata verir
let fact (n: float) = function 
    | 0.0 -> 1.0 
    | _ -> [1.0 .. n] |> List.reduce (*) 

let taylor (e: float) = 
    let term (n: float) = (e ** n)/(fact n) 
    [1.0 .. 10.0] 
     |> List.map (term) 
     |> List.reduce (+) 

:

EvaluatingEtotheX.fs(9,39): error FS0001: The type 'float -> float' does not match the type 
'float' 

EvaluatingEtotheX.fs(9,36): error FS0043: The type 'float -> float' does not match the type 
'float' 

(let term n = (e ** n)/(fact n) olduğu Hattı 9).

Bu neden çalışmıyor ? Bu hata tam olarak ne anlama geliyor? Derleyici neden float değerini veren ve gerçek bir float değeri olmayan bir işlevi iletiyor? Sadece F'yi öğrenmeye başladığımı unutmayın, bu yüzden bu durumun neden bu işe yaramayacağını bilmiyorum.

+0

Yukarı-oylama birisi bile niçin bir yorum bırakmadan onu aşağı olarak neden herhangi bir neden görmüyorum çünkü . –

cevap

8

için fact fonksiyonunu tanımlamak için söz dizimi iki tür karıştırma.

function anahtar kelime kullanarak

, örtülü sonra tanımlanan dallarında kullanılan bir argüman, ekler. Eğer fact tanımının imzayı kontrol ederseniz, float -> float -> float yerine float -> float göreceksiniz. tanımına ilk şamandıra ikinci bir sen function anahtar kelime kullanmak gerçeği ile eklenir, n karşılık gelir.

Ya fonksiyon anahtar kelime

let fact = function 
    | 0.0 -> 1.0 
    | n -> [1.0 .. n] |> List.reduce (*) 

veya açık maç ifade kullanabilirsiniz

let fact n = 
    match n with 
    | 0.0 -> 1.0 
    | _ -> [1.0 .. n] |> List.reduce (*) 
(derleyici n float olarak türünü anlaması mümkün olacak, gerek elle belirtmek için) bu durumda pratik bir sorun olmayacak olsa

bir yan not, tam değerlerine karşı karşılaştırarak yüzer genellikle iyi bir fikir değildir ikili temsillerinden dolayı. Senin durumunda bu tamsayılar üzerinde faaliyet gösteren fact tutmak için mantıklı ve daha sonra sonucu döküm olabilir:

let term n = (e ** n)/(float (fact (int n))) // assumes fact : int -> int 
+1

, 'fact' argümanları taşma üretmeyecek kadar küçük olduğu sürece ... – Onur