SORU
12 AĞUSTOS 2010, PERŞEMBE


Nasıl polyvariadic haskell bir işlevi oluşturmak için?

Değişkenler (aynı türden) rasgele bir sayı alır bir işlevi ihtiyacım var, onlarla bir şeyler yapar ve sonra sonuç geri verir. Bir bağımsız değişkenler listesindeki benim belirli bir durumda uygulanamaz.

Haskell libs baktım fonksiyonu printf (Text.Printf modülünden) benzer bir hile kullanan gördüm. Ne yazık ki, kaynağına bakarak o sihirli anlayamadım.

Bunun için iyi bir açıklama nerede bulabileceğimi biri bu, ya da en azından bir web sayfası elde etmek için nasıl açıklamak/kağıt/ne olabilir?

Motivasyon:

Buna ihtiyacım var nedeni çok basit. Okul (bilgisayar bilimleri sınıfı), biz gerekli yazma modülü bu mümkün, "kayıt" bir matematiksel ifade, ifade olarak bir dize () yazı örneği Sayı/Gerçek/etc için kendi veri türü), ve çeşitli işlemleri gerçekleştirmek.

Bu veri türü belirli bir fonksiyon tarafından herhangi bir değer ya da değiştirilebilir bir değişken için özel bir kurucu içerir. Hedeflerinden biri değişken sayısı (tip çiftleri (Char,Rational)) gibi bir ifade alır ve ifadenin sonucu hesaplayan bir fonksiyon yazmak. Fonksiyonun hedefe en iyi nasıl ifade bakmalıyız. (Benim fikrim: Eğer işlevi içinde tanımlanan değişkenleri tam olarak, pek çok argüman alan bir fonksiyon imkansız gibi görünüyor) verir.

CEVAP
12 AĞUSTOS 2010, PERŞEMBE


printf kilit noktaları ya da bir Dize ya da bir işlev döndürme yeteneğidir. http://www.haskell.org/ghc/docs/6.12.2/html/libraries/base-4.2.0.1/src/Text-Printf.html, kopyalanmış

printf :: (PrintfType r) => String -> r
printf fmts = spr fmts []

class PrintfType t where
    spr :: String -> [UPrintf] -> t

instance (IsChar c) => PrintfType [c] where
    spr fmts args = map fromChar (uprintf fmts (reverse args))

instance (PrintfArg a, PrintfType r) => PrintfType (a -> r) where
    spr fmts args = \a -> spr fmts (toUPrintf a : args)

ve dışarı seçebiliriz temel yapısı

variadicFunction :: VariadicReturnClass r => RequiredArgs -> r
variadicFunction reqArgs = variadicImpl reqArgs mempty

class VariadicReturnClass r where
   variadicImpl :: RequiredArgs -> AccumulatingType -> r

instance VariadicReturnClass ActualReturnType where
   variadicImpl reqArgs acc = constructActualResult reqArgs acc

instance (ArgClass a, VariadicReturnClass r) => VariadicReturnClass (a -> r) where
   variadicImpl reqArgs acc = \a -> variadicImpl reqArgs (specialize a `mappend` acc)

Örneğin:

class SumRes r where 
    sumOf :: Integer -> r

instance SumRes Integer where
    sumOf = id

instance (Integral a, SumRes r) => SumRes (a -> r) where
    sumOf x = sumOf . (x  ) . toInteger

daha sonra kullanabiliriz

*Main> sumOf 1 :: Integer
1
*Main> sumOf 1 4 7 10 :: Integer
22
*Main> sumOf 1 4 7 10 0 0  :: Integer
22
*Main> sumOf 1 4 7 10 2 5 8 22 :: Integer
59

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • captainpuppys2000

    captainpuppy

    20 HAZİRAN 2013
  • NextGenWindows

    NextGenWindo

    8 Kasım 2011
  • pissengehen

    pissengehen

    26 EYLÜL 2006