2010-09-14 22 views
20

Szukałem wielu źródeł: to nie wydaje się możliwe, aby zadeklarować definicji typu w F # ala Haskell:F # Deklaracja typu możliwe ala Haskell?

' haskell type def: 
myFunc :: int -> int 

Chciałbym wykorzystać ten styl typu def w F # - FSI jest szczęśliwy echo z powrotem do mnie:

fsi> let myType x = x +1;; 

val myType : int -> int 

Chciałbym być wyraźnie o podpisie def typu w F # jak w Haskell. Czy jest jakiś sposób na zrobienie tego? Chciałbym napisać w języku F #:

//invalid F# 
myFunc : int -> int 
myFunc x = x*2 
+8

@Jon: ciekawa pozycja. Dlaczego to "znane bzdury"? Jest to całkowicie opcjonalne w Haskell i osobiście uważam, że jest to bardzo pomocne, ponieważ mogę nakreślić, w jaki sposób chcę, aby moje typy były zgodne. Jestem zainteresowany tym, co widzisz problem z defektami typu. –

+0

@Kevin: Rezygnowanie z pisania adnotacji prawie zawsze odzwierciedla niedociągnięcia w systemie typów, zwykle te zaawansowane funkcje powodowałyby w przeciwnym razie zaciemnianie komunikatów o błędach. Dzieje się tak, gdy przekraczasz słaby punkt, który uderza ML, dodając bardziej zaawansowane formy wnioskowania do systemu typów. Obejście problemu w OCaml polegało na dodaniu adnotacji typu do definicji argumentów przy użyciu polimorficznych wariantów lub obiektów. Obejście problemu w Haskell polegało na tym, aby adnotacje typu były wszechobecne ze względu na wszechobecność klas typów (i brak jakichkolwiek alternatyw). –

+2

@Jon: Dzięki za wyjaśnienia. Myślę jednak, że mówimy o dwóch różnych przyczynach tych adnotacji. Nie chcę adnotacji typu dla kompilatora: chcę tego dla mnie! Innymi słowy, uważam, że pomocne jest wyjaśnienie w jednoznaczny sposób tego, do czego potrzebuję różnych funkcji.Uważam, że po prostu pracując nad sygnaturami typu, mogę uzyskać długie sposoby rozwiązania tego problemu. –

Odpowiedz

18

Jeśli chcesz zachować czytelne deklaracje typu niezależnie od implementacji, możesz użyć plików "fsi" (F # Signature File). "Fsi" zawiera tylko typy i zazwyczaj również komentarze - możesz zobaczyć kilka dobrych przykładów w źródle bibliotek F #. Można by stworzyć dwa pliki tak:

// Test.fsi 
val myFunc : int -> int 

// Test.fs 
let myFunx x = x + 1 

Działa to dla opracowanych projektów, ale nie można łatwo korzystać z tego podejścia z F # Interactive.

+1

Uważam, że styl typu Haskella (i sposób .fsi) jest przydatnym sposobem "szkicowania" w języku F #. jakikolwiek pomysł, dlaczego FSI tego nie popiera - i dlaczego nie można tak po prostu wykonać tych znaków w linii? Czy to jest więcej tradycji OCaml? –

+3

@Kevin: Nie jestem pewien, ale zgadzam się, że sposób Haskella wygląda bardziej czytelnie niż mieszane adnotacje nagłówka/typu. Jest to prawdopodobnie tradycja OCaml, ponieważ nie wydaje mi się, że jest z tym jakikolwiek problem techniczny. Pisanie ich inline miałoby sens ... (Innym pytaniem jest, czy jest to warte ograniczonych zasobów zespołu F # w tym momencie) –

+2

dzięki Tomas. Tylko dla płyty, zespół F #, całkiem proszę? adnotacje w czasie rzeczywistym? –

1

Możesz to zrobić w F #, aby określić zwracaną wartość myType.

let myType x : int = x + 1 

Można również określić typ parametru.

let myType (x : int) : int = x + 1 

Mam nadzieję, że to pomoże!

+0

Cytat: http://msdn.microsoft.com/en-us/library/dd233229.aspx – sholsapp

20

Zwykły sposób to zrobić let myFunc (x:int):int = x+1.

Jeśli chcesz być bliżej stylu haskell, możesz także wykonać let myFunc : int -> int = fun x -> x+1.

+0

Wiem, że możesz określać typy w ten sposób za pomocą rzeczywistej definicji funkcji - nie jest to dokładnie to, o co pytam. w każdym razie dzięki. –

+0

@Kevin: Upewnij się, że rozumiesz różnicę między adnotacją typu a definicją typu. –

-1

tak można, przy użyciu funkcji Lambda

myFunc : int -> int = 
    fun x -> x*2 

ten sposób unika się również problem w Haskell pisania nazwę funkcji dwa razy.

+1

jest to duplikat odpowiedzi @ sepp2k. – bytebuster