SORU
16 Ocak 2014, PERŞEMBE


Yüksek kinded türleri yararlıdır?

Dev F yapıyorum# bir süre ve ben bunu seviyorum. Bildiğim bir terim F yok ancak# yüksek kinded türleri. Yüksek kinded tür malzeme okudum ve kendi tanımını anlıyorum. Sadece işe yarıyorlar neden emin değilim. Birisi F yüksek-kinded tür geçici çözümler gerektiren Scala veya Haskell, kolay bazı örnekler verebilir#? Ayrıca bu örnekler için, çözümlerden daha yüksek kinded türleri olmadan ne olurdu (veya F vice-versa)? Belki de bu özelliğin yokluğunu fark etmemiş olmam çevresinde çalışmaya o kadar alıştım ki.

(Sanırım) myList |> List.map f myList |> Seq.map f |> Seq.toList yüksek yerine kinded türleri sadece myList |> map f yazmak için izin aldım ve List bir dönüş olacak. Bu büyük (doğru olduğunu varsayarsak), ama biraz küçük görünüyor? (Ve bu sadece fonksiyon aşırı yükleme vererek yapılamaz mıydı?) Ben genelde Seq neyse dönüştürmek ve o zaman ne istersem daha sonra dönüştürebilirsiniz. Yine, belki çalışmaya da alıştım. Ama orada daha kinded türleri herhangi bir örnektirgerçektenya tuş vuruşlarını veya güvenlik türü olarak kaydeder misin?

CEVAP
16 Ocak 2014, PERŞEMBE


Bir tür tür basit türüdür. Örneğin Int baz tipi demektir ve değerler tarafından oluşturulabileceği hangi tür * vardır. Yüksek kinded tip bazı gevşek tanımı (F emin değilim# satır, sadece dahil edelim) bu yüzden çekiyorpolimorfik kaplaryüksek-kinded bir tür büyük bir örnektir.

data List a = Cons a (List a) | Nil

Bu tür yapıcı List tür * -> * hangi anlamı olmalı geçirilen bir beton türü için neden bir beton türü: List Int - ebilmek var sakinleri gibi [1,2,3] List kendisi olamaz.

Polimorfik konteyner, sağlık konteyner daha belirgin, ama * -> * türü var biraz daha yararlı olduğunu farz edeceğim. Örneğin, ilişkiler

data Rel a = Rel (a -> a -> Bool)

ya ayrıştırıcıları

data Parser a = Parser (String -> [(a, String)])

hem de tür * -> *.


Bu daha bile tür üst düzey türlü alarak Haskell, ancak yaparız bunu. Örneğin tür bir tür (* -> *) -> * bakabiliriz. Bu basit bir örnek tür bir kabı doldurmak için çalışan Shape * -> * olabilir.

data Shape f = Shape (f ())

[(), (), ()] :: Shape List

Bu her zaman şekil ve içeriğini kendi ayrılabilir olarak Haskell Traversables tanımlamak için yararlı, örneğin.

split :: Traversable t => t a -> (Shape t, [a])

Bir başka örnek olarak, diyelim var şube üzerinde parametreli bir ağaç düşünün. Örneğin, normal bir ağaç olabilir

data Tree a = Branch (Tree a) a (Tree a) | Leaf

Ama şube tipi Tree a s Pairiçeren ve tür parametrik olarak o parça çıkarmak, böylece biz de görebiliyoruz

data TreeG f a = Branch a (f (TreeG f a)) | Leaf

data Pair a = Pair a a
type Tree a = TreeG Pair a

TreeG bu tür yapıcı 40* *var. RoseTree gibi ilginç diğer varyasyonları yapmak için kullanabiliriz

type RoseTree a = TreeG [] a

rose :: RoseTree Int
rose = Branch 3 [Branch 2 [Leaf, Leaf], Leaf, Branch 4 [Branch 4 []]]

Ya da patolojik olanlar MaybeTree gibi

data Empty a = Empty
type MaybeTree a = TreeG Empty a

nothing :: MaybeTree a
nothing = Leaf

just :: a -> MaybeTree a
just a = Branch a Empty

Ya bir TreeTree

type TreeTree a = TreeG Tree a

treetree :: TreeTree Int
treetree = Branch 3 (Branch Leaf (Pair Leaf Leaf))

Bu gösterir başka bir yerde "funktorlar cebiri". Eğer soyutluk bir kaç kat atarsak bu bir kat daha iyi olarak düşünülebilir, sum :: [Int] -> Int gibi. Cebiri üzerinde parametrelifunctorvetaşıyıcı.functorvar * -> * taşıyıcı tip 49* *yani tamamen

data Alg f a = Alg (f a -> a)

olan tür (* -> *) -> * -> *. Alg veri türleri ve özyineleme düzenleri onları üstüne inşa edilmiş olan ilişkisi nedeniyle yararlı.

-- | The "single-layer of an expression" functor has kind `(* -> *)`
data ExpF x = Lit Int
            | Add x x
            | Sub x x
            | Mult x x

-- | The fixed point of a functor has kind `(* -> *) -> *`
data Fix f = Fix (f (Fix f))

type Exp = Fix ExpF

exp :: Exp
exp = Fix (Add (Fix (Lit 3)) (Fix (Lit 4))) -- 3   4

fold :: Functor f => Alg f a -> Fix f -> a
fold (Alg phi) (Fix f) = phi (fmap (fold (Alg phi)) f)

Teorik olarak mümkün olsalar da nihayet, bir bakın ben hiçbileyüksek kinded tür yapıcı. Biz bazen ama yazın giriş kazmak gerekecek sanırım ya da bağımlı yazılı edebiyat türleri içinde karmaşıklık düzeyini görmek için* *54, gibi bu tür işlevleri bakın.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Joshua Bane

    Joshua Bane

    24 Temmuz 2007
  • NextKsa

    NextKsa

    7 EKİM 2009
  • UKF

    UKF

    2 Aralık 2009