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
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
@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
Teşekkürler Ben. Infix vs prefix notasyonu kaçırıyordum, ama şimdi açık! – crockeea