2012-01-23 33 views
6

Bu, Yansıma-0.5'den alınan minimal bir örnektir.Haskell: Neden bu tip kontrolü yapıyor?

>:t Zero 
Zero :: Zero -> Zero 

Bu mantıklı: Bir Sıfır alır ve bir Zero döndüren yapıcı türü için soruyorum GHCi yılında

{-# LANGUAGE Rank2Types, MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances #-} 
{-# OPTIONS_GHC -fno-cse -fno-full-laziness -fno-float-in #-} 

import Control.Applicative 
import Data.Proxy 

newtype Zero = Zero Zero deriving (Show) 

class ReifiesNum s where 
    reflectNum :: Num a => proxy s -> a 

instance ReifiesNum Zero where 
    reflectNum = pure 0 

, aşağıdaki alıyorum.

>:t reflectNum 
reflectNum :: (ReifiesNum s, Num a) => proxy s -> a 

Ben tip Hemen Sıfır tip değişkenler 'vekil s' maçları

>let x = Just (undefined::Zero) 
>reflectNum x 

çünkü böyle bir şey yazabilirsiniz mantıklı.

Son olarak, kafa karıştırıcı kısmı:

>:t (reflectNum Zero) 
(reflectNum Zero) :: Num a => a 

Sıfır :: Sıfır yapıcı tipi nasıl anlamıyorum -> Sıfır görünüşte tip değişkenler 'vekil s' ile eşleşir, ancak görünüşe göre bunun nedeni yok (reflectNum Zero) türü sadece 'a'dır.

Bu örneği anlama konusunda yardımcı olmaktan memnuniyet duyarız ve ilgili kavramlara bağlantılar çok beğenilecektir.

Teşekkür

cevap

11

O seni atma fonksiyonu ok sadece infix sözdizimi var. İlk olarak, anlaşılması kolay bir durum olan bir örnek: Maybe Int. o proxy s maç yapmak için, sadece ayarlayın:

proxy = Maybe 
s = Int 

Şimdi a -> b yerine Fun a b yazılı ve böylece Zero Fun Zero Zero (yani (Fun Zero) Zero) tip vardır davranalım. proxy (->) Zero olduğunu Gerçekte

proxy = Fun Zero 
s = Zero 

ve böylece proxy s((->) Zero) Zero(->) Zero ZeroZero -> Zero şudur: proxy s maç yapmak için, biz ayarlayın.

+0

Neden "(->) Zero" geçerli bir türdür? "> X olsun [bir şey] :: ((->) Sıfır)" gibi bir şeyi nasıl yazabileceğimi hayal edemiyorum. Umarım mantıklı olurum. Cevap için teşekkürler! – crockeea

+3

@Eric '(->) Sıfır 'geçerli bir tür değil, bir tür oluşturmak için başka bir türe uygulanması gereken bir * tipi kurucu *. Aynı şey 'Belki'; "Belki" türünde hiçbir değer yoktur, fakat "Belki İnt", "Belki [Çift]", "Belki (Belki (Belki Şar))" vb. değerleri vardır. Aynı şekilde, türden hiçbir değer yoktur. (->) Sıfır', fakat '(->) Sıfır Sıfır 'yani Sıfır -> Sıfır' türünde değerler vardır. – Ben

+0

Teşekkürler Ben. Infix vs prefix notasyonu kaçırıyordum, ama şimdi açık! – crockeea