SORU
9 ŞUBAT 2014, Pazar


Nasıl işlev imzaları Haskell kısmen tanımlamak için?

Başlangıç noktası:

fn :: [a] -> Int
fn = (2 *) . length

Hadi diyoruzsadecedönüş sınırlamak için istediğiniz değeri, ardından yazabiliriz:

fn list = (2 * length list) :: Int

Nasıl kısıtlama hakkındasadeceargümanı? Kolay.

fn list = 2 * length (list :: [Char])

Bu işleri yaparken, imzaları tercih edebilirsiniz üst kısmında toplanan ve dağınık işlevi vücudun.

Bu gelebildiğim en yakın:

fnSig = undefined :: [Char] -> a
fn | False = fnSig
   | True  = (* 2) . length

http://okmij.org/ftp/Haskell/types.html#partial-sigs ile http://okmij.org/ftp/Haskell/partial-signatures.lhs dayanarak

Ancak, temiz bir çözüm istiyorum. Amacım kısmi kısıtlama olduğunu daha iyi iletişim kuran bir şey. Örneğin: böyle bir şey

fn :: [Char] -> a
fn = (2 *) . length

Ya da belki de:

fn :: [Char] -> _
fn = (2 *) . length

Bu mümkün mü?

Daha fazla açıklama için Edit:

@GaneshSittampalam yorum altında önemli bir noktaya işaret etti. Arıyorum "hayır yazın imza at ve hassas bir vermek zorunda arasında yarı yolda bir ev". Yani, TypeClass tabanlı bir cevap aramıyorum, sadece DZD benim fonksiyonun belirsiz (ya da tam olarak kısıtlı) türleri için, boşlukları doldurmak istiyorum.

@WillNess yanıt olarak düzenleyin

Evet, Aşağı Yukarı böyle bir şey...

fn list = 2 * length list
  where
    _ = list :: [Char]

...ama sadece değişkenler için işe yarayabilir, ancak ve ancak işlevi-ücretsiz noktasıdır. Bir yol noktası-ücretsiz işlevleri veya dönüş değerleri için bu tekniği uygulamak için var mı?

@Rhymoid yanıt olarak düzenleyin

İlham geldi ve @Rhymoid fikri ile yaklaşık oynadı ve bu ile geldi:

fn = (2 *) . length
  where
    _ = fn `asTypeOf` (undefined :: [Char] -> a)
    _ = fn `asTypeOf` (undefined :: a -> Int)
    _ = fn `asTypeOf` (undefined :: a -> b)
    _ = fn `asTypeOf` (undefined :: a)

Bu yaklaşım ayrıca fn tür imza kısıtlar ve herhangi bir ad kirleten yok.

Sadece asTypeOf satır olurdu normalde, ben ne kadar güçlü bu yaklaşım sadece vitrin için birden fazla ekledi.

Bunu istiyorum nasıl, biraz daha sakar, ama dilini bile belirli sözdizimsel desteği olmadan bunu yapabiliriz çok güzel olur sanırım.

@Rhymoid, Eğer isterseniz, sizin de cevap lütfen ekleyin. :)

CEVAP
9 ŞUBAT 2014, Pazar


Kusura bakma, kendini promosyon, ama tam olarak bu özellik konusuna bir son kağıt Ph. D. öğrencisi Thomas Winant, kendimi, Frank Piessens ve Tom Schrijvers, çok yakın zamanda sunulmuş tarafından Thomas de PADL 2014 Sempozyumu. Tam kağıt için here bkz. Zaten bazı diğer dillerde mevcut olan bir özelliktir, ama Haskell GADTs gibi özellikleri ile etkileşim ayrıntılar üzerinde çalışmak için yeterince ilginç yaptı.

Thomas DZD için bir uygulama üzerinde çalışıyor. Daha fazla kağıt yazma beri geliştirilmiş, ama "" DZD teknik olarak beklediğimizden biraz daha zordur. joker kısıtlama uygulama var Bekliyoruz edebilmek için daha fazla çalışması ve iletişim DZD geliştiriciler için kabul etti, ama olsun veya olmasın bu durum olabilir bağlı insanların ne kadar istiyor olmalı özelliği Haskell.

Güncelleme 14-4-2015: Thomas tarafından bir sürü iş ve SPJ ve diğer DZD insanlardan girdikten Sonra, kısmi tür imzalar DZD 7.10 serbest bırakıldı. Thomas Winant onları nasıl kullanabileceğiniz hakkında an introductory blog post yazdı.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • boogie2988

    boogie2988

    6 NİSAN 2006
  • Harvest: Greg Laurie

    Harvest: Gre

    6 HAZİRAN 2006
  • mobilenet.cz

    mobilenet.cz

    26 NİSAN 2008