Al fine di calcolare l'area di quadrato e cerchio, ho definito il seguente tipo:modo funzionale di scrivere questi metodi in F #
type Square = {width: float; length: float;} with
member this.area = this.width * this.length
member this.perimeter = (this.width + this.length) * 2.
type Circle = {r:float} with
member this.area = System.Math.PI * this.r * this.r
member this.perimeter = 2. * System.Math.PI * this.r
let s1 = {width = 3.; length = 4.}
let c1 = {r = 8.3}
printfn "%A" s1
printfn "The area of s1 is: %A" s1.area
printfn "The perimeter of s1 is: %A" s1.perimeter
printfn "%A" c1
printfn "The area of c1 is: %A" c1.area
printfn "The perimeter of c1 is: %A" c1.perimeter
Quando ho letto questo articolo: http://fsharpforfunandprofit.com/posts/type-extensions/
Essa afferma:
- metodi non giocare bene con inferenza di tipo
- metodi non giocare bene con highe R ORDINANZA funzioni
Quindi, un appello per chi è nuovo al punto di vista funzionale la programmazione. Non utilizzare affatto i metodi se possibile, specialmente quando si sta imparando. Sono una stampella che ti impedirà di trarre il massimo vantaggio dalla programmazione funzionale .
Allora qual è il modo funzionale per risolvere questo problema? o qual è il modo di F # idomatic?
Edit:
Dopo aver letto le "F # Component Design Guidelines" (inchino a @VB), e @ commento di JacquesB, ritengo che implementano il metodo membro all'interno del tipo è il più semplice, modo intrinseco:
type Square2 (width: float, length: float) =
member this.area = width * length
member this.perimeter = (width + length) * 2.
(questo è quasi identica alla mia Square
tipo originale - questo Square2
salva solo seveal this.
prefisso a 01.231., this.length
.)
Ancora una volta, il The F# Component Design Guidelines è abbastanza utile.
Più funzionale non è necessariamente più F # idiomatico! F # è un linguaggio oo/funzionale, e l'uso appropriato dei metodi va bene. La citazione riguarda davvero * apprendimento * programmazione funzionale quando già conosci oo, e in tal caso cercare di essere il più funzionale possibile è un buon esercizio di apprendimento. – JacquesB
Per quanto riguarda le due risposte attuali e l'appello contro i "metodi", usa un'unione discriminata quando conosci tutti i tuoi casi in anticipo. Questo è più funzionale e mappa veramente meglio il tuo dominio - queste N opzioni sono i miei unici casi - e imparerai più F # da esso. Usa un'interfaccia (e metodi) quando vuoi essere in grado di definire nuove implementazioni ad-hoc attraverso il tuo programma. –