Soru F # tipi beyan mümkün ala Haskell?


Bir dizi kaynağa baktım: F # ala Haskell'de bir tür tanımını bildirmek mümkün görünmüyor:

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

F tipi bu tür-def stili kullanmak istiyorum - FSI bana geri yankı mutlu:

fsi> let myType x = x +1;;

val myType : int -> int

Haskell'de olduğu gibi F # cinsinden tip def imzası konusunda açık olmak isterim. Bunu yapmanın bir yolu var mı? F # 'da yazmak isterim:

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

22
2017-09-14 21:58


Menşei


@ Jon: ilginç pozisyon. Neden bu 'bilinen olmak' için? Haskell'de tamamen isteğe bağlı ve kişisel olarak, türlerimin sıralamasını nasıl istediğimi tasvir etmenin bir yolu olarak oldukça faydalı buluyorum. Ne tür problemlerle karşılaştığınızı görmek istiyorum. - Kevin Won
@Jon: Type sınıfları, açık tip imzalara veya yazım ek açıklamalarına ihtiyaç duymaz. Tip sınıflarını içeren Haskell98, tamamen çıkarılmaz. Çok parametreli tip sınıflarının çoğu standart kullanımlarıdır. Açık tip ek açıklamalar ya da imzalar genellikle, tamamen çıkarılamaz olduğu kanıtlanmış olan yüksek dereceli polimorfizm için gereklidir. Daha yüksek sıralamalı tiplerle çok sayıda yararlı fonksiyon var ve kullanıcılara seçenek bunları "tip sistemindeki eksiklik" olarak kullanma. - sclv
@Jon: Haskell'deki tür ek açıklamalarının tür sınıflarının her yerde bulunabilmesi nedeniyle her yerde bulunduğuna dair yanlış iddiana doğru bir cevap verdim. Açık bir tip imzası gerekmediğinde bile, kodun belgelenmesi, kullanımı zorlamak ve hata mesajlarının yerini iyileştirmek için (diğer şeyler arasında) hizmet edebilir. - sclv
@Jon: Yorumlarınızdan F # 'nin inanılmaz derecede savunmacı olduğunu düşündüğünüzden farkettim. Ön yargınız F # danışmanlık şirketinizi ve yayınlarınızı korumak istemekten anlaşılabilir, ancak şüphesiz zekânın sahip olduğu zekanın F # 'in kesinlikle mükemmel olmadığını ve Haskell' den bir kaç sayfa alabileceğini bilmesi daha iyi olur. mükemmel). İşlevsel dillere gelince, bu ikisi oldukça farklıdır ve her ikisi de diğeri içinde kullanılan dil sözleşmelerinden kesinlikle faydalanabilir. - Paul
@Jon: Tabi ki kararım, sadece Stack Overflow'taki birkaç yazınızın göründüğüne dayanıyordu ve daha net olmak gerekirse, her dilin OCaml olmasını istediğiniz görülüyor. Kabul edilebilir bir şekilde yanlış olabilirdim, ancak basit, zarif ve isteğe bağlı (!!!) gibi satır içi yazı tipi açıklamaları (tür sınıflarının yanı sıra) birtakım nedenlerden dolayı 'kötü' olarak reddedilirse, bazı kırmızı bayraklar yükselir. Ayrıca, bir gönderinin küçük bir alt kümesine cevap vermek ve geri kalanını reddetmek de uygun olabilir, ama ben çok yapıcı olmadığına katılıyorum bile eminim. - Paul


Cevaplar:


Eğer okunabilir tip bildirimlerini uygulamadan ayrı tutmak istiyorsanız, 'fsi' dosyalarını (F # İmza Dosyası) kullanabilirsiniz. 'Fsi' sadece türleri ve genellikle yorumları içerir - F # kütüphanelerinin kaynağında iyi örnekler görebilirsiniz. Bunun gibi iki dosya oluşturursunuz:

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

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

Bu derlenmiş projeler için çalışır, ancak bu yaklaşımı F # Interactive ile kolayca kullanamazsınız.


19
2017-09-14 22:27



Haskell Type def stilini (ve .fsi yolunu) F # içinde 'çizim' için kullanışlı bir yol gibi buluyorum. FSI'nin bunu neden desteklemediğine dair herhangi bir fikriniz - ve neden bu sigları neden sıralayamıyorsunuz? Bu daha fazla OCaml geleneği mi? - Kevin Won
@Kevin: Gerçekten emin değilim, ama Haskell yolunun daha sonra okunabilir ve daha sonra karışık başlık / tür ek açıklamaları göründüğünü kabul ediyorum. Muhtemelen OCaml geleneğidir, çünkü bununla ilgili herhangi bir teknik sorun olduğunu düşünmüyorum. Onları satır içi yazmak mantıklı olacaktır ... (Başka bir soru, bunun bu noktada sınırlı F # takım kaynaklarına değip değmeyeceğidir) - Tomas Petricek
teşekkürler Tomas. Sadece kayıt için, F # takımı, oldukça lütfen? çevrimiçi zaman ek açıklamaları? - Kevin Won
Onları da isterdim, ama üzgünüm, gemi burada sözdizimi için yola çıktı ve 'katkı' değişikliği için bir planımız yok. Ayrıca bakınız stackoverflow.com/questions/979084/... - Brian
Ayrıca, .fsi'nin .fs'den sonra da kontrol edildiğini unutmayın. Bu nedenle, .ferici karakterini mutlu etmek için .fs içinde bazı tür ek açıklamalara ihtiyacınız olabilir. - Nathan Shively-Sanders


Her zamanki yol yapmak let myFunc (x:int):int = x+1.

Eğer haskell tarzına daha yakın olmak istiyorsanız, aynı zamanda let myFunc : int -> int = fun x -> x+1.


21
2017-09-14 22:04



Türlerini gerçek işlev tanımınızla bu şekilde belirleyebileceğinizi biliyorum - bu tam olarak ne istediğimi değil. yine de teşekkürler. - Kevin Won
@Kevin: Bir tür ek açıklama ve bir tür tanımı arasındaki farkı anladığınızdan emin olun. - Jon Harrop


Bunu myType'ın dönüş değerini belirtmek için F # gibi yapabilirsiniz.

let myType x : int = x + 1

Parametrenin türünü de belirtebilirsiniz.

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

Bu yardımcı olur umarım!


1
2017-09-14 22:03



Citation: msdn.microsoft.com/en-us/library/dd233229.aspx - sholsapp


Ayrıca bakınız F # Temel Sözdizimi - Türleri (Bu yönü biraz 'tip açıklamaları' altında tartışır).


1
2017-09-14 22:43





Başka bir seçenek "tip kısaltmalar" kullanmaktır (http://msdn.microsoft.com/en-us/library/dd233246.aspx)

type myType = int -> int
let (myFunc : myType) = (fun x -> x*2)

1
2018-06-25 23:08





evet, lambda fonksiyonlarını kullanarak yapabilirsiniz

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

Bu, aynı zamanda fonksiyon isminin iki kez yazılmasının haskell'deki problemini de ortadan kaldırır.


-1
2017-10-19 07:52



Bu, sepp2k'nin bir kopyasıdır. - bytebuster