SORU
30 NİSAN 2011, CUMARTESİ


Haskell: yardımcı fonksiyon adı neden "git"?

Görüyorum go çok fazla zaman okuma Haskell malzeme ya da kaynak, ama hiç gitmedim çok rahat konu - (sanırım var negatif çağrışım "git" in my mind). LYAH ile Haskell öğrenmeye başladım, ve o kadar kıvrımlar yazarken acc step kullanma eğilimi, öyle öğrendim. Nereye sözleşme yazmak için go nereden geliyor?

En önemlisi, tam olarak adını go ima için ne gerekiyor?

CEVAP
30 NİSAN 2011, CUMARTESİ


Hmm! Bazı Arkeoloji!

2004 etrafında kuyruk özyinelemeli işçi döngüler için jenerik isim olarak go kullandım yana, bir işçi yaparken/özyinelemeli bir işlev dönüşümü sarıcı. Yaygın bytestring, örneğin kullanmaya başladım

foldr :: (Word8 -> a -> a) -> a -> ByteString -> a
foldr k v (PS x s l) = inlinePerformIO $ withForeignPtr x $ \ptr ->
        go v (ptr `plusPtr` (s l-1)) (ptr `plusPtr` (s-1))
    where
        STRICT3(go)
        go z p q | p == q    = return z
                 | otherwise = do c  <- peek p
                                  go (c `k` z) (p `plusPtr` (-1)) q -- tail recursive
{-# INLINE foldr #-}

Ağustos 2005. bytestring

Bu in RWH, yazılı ve muhtemelen orada popüler oldu. Ayrıca, in the stream fusion kütüphane, Duncan Coutts ve bunu çok yapmaya başladım.

DZD kaynaklardan

Bu deyim daha da geriye gider. foldr in GHC.Base olarak verilmektedir

foldr k z = go
      where
         go []     = z
         go (y:ys) = y `k` go ys

sihirbaz numarasını (bu Andy Gill tez gelen sanırdım, ama go herhangi bir yerde kullanamaz yok) seçtim de aşağıda.değilÇırak bu formda verilen, yani bu ilk DZD kod tabanı çıktı sanırım.

2001, Simon Marlow kullanmış go bazı sistemlerde seviye kod, bu yüzden belki yer suçu bir yerde DZD ve bu ipucu açar bize the GHC source nereye go yaygın olarak kullanılan işçi fonksiyonlar:

myCollectBinders expr
  = go [] expr
  where
    go bs (Lam b e)          = go (b:bs) e
    go bs e@(Note (SCC _) _) = (reverse bs, e)
    go bs (Cast e _)         = go bs e
    go bs (Note _ e)         = go bs e
    go bs e                  = (reverse bs, e)

DZD 3.02 ve Glasgow

Yukarı DZD eski sürümleri kazma, DZD 0.29 içinde bu deyim görünmüyor görüyoruz, ama 3.02 serisi (1998) DZD tarafından, go deyim her yerde görülüyor. Bir örnek, showInt, 1996-1997 tarihli: tanımı Numeric.lhs

showInt n r
  | n < 0     = error "Numeric.showInt: can't show negative numbers"
  | otherwise = go n r
    where
     go n r =
      case quotRem n 10 of                 { (n', d) ->
      case chr (ord_0   fromIntegral d) of { C# c# -> -- stricter than necessary
      let
    r' = C# c# : r
      in
      if n' == 0 then r' else go n' r'
      }}

bu bir given in the H98 report farklı bir uygulamasıdır. Kazma içine uygulanması "Numeric.lhs" ancak biz bulmak değil aynı sürümü eklenmiştir DZD 2.06 1997, ve çok ilginç bir yama Sigbjorne Finne görünür, Nisan 1998, adding a go loop to Numeric.lhs.

Bu en az 1998, Sigbjorne go DZD "" aynı anda, 33 ** go döngüler vardı. kütüphane, std döngüler ekleme olduğunu söylüyor Kazma daha, buvery interesting commit from Will Partain in July 1996 adds a "go" loop into GHCkodu Simon geliyor PJ arada!

Bu gibi arayacağımGlasgow bir deyimorta DZD üzerinde çalışmış olan Glasgow insanlarSimon Marlow, Sigbjorn Finne, Will Partain ve Simon Peyton Jones gibi 90'lı tarafından icat edildi.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • eurotuner

    eurotuner

    6 Mart 2006
  • metal571

    metal571

    30 Mayıs 2006
  • ThePhestor

    ThePhestor

    22 Mart 2011