이것은 Reflection-0.5에서 가져온 최소한의 예입니다.하스켈 : 왜이 형식 검사를합니까?
는>:t Zero
Zero :: Zero -> Zero
이 의미가 있습니다 : 나는 제로를 취하고 0을 반환 생성자의 유형에 대한 부탁 해요 GHCi에서
{-# 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
, 나는 다음과 같은 얻을.
>:t reflectNum
reflectNum :: (ReifiesNum s, Num a) => proxy s -> a
내가 유형 그냥 제로 된 형태 변수 '프록시의'일치
>let x = Just (undefined::Zero)
>reflectNum x
때문에 뭔가를 쓸 수있는 의미가 있습니다.
마지막으로, 혼란스러운 부분 :
>:t (reflectNum Zero)
(reflectNum Zero) :: Num a => a
제로 :: 제로 생성자의 종류 어떻게 이해하지 않는다 -> 제로 분명히 된 형태 변수 '프록시들'일치하지만은 분명히이 있기 때문에 수행 유형 (reflectNum Zero)은 'a'입니다.
이 예제를 이해하는 데 도움을 주셔서 감사 드리며 관련 개념에 대한 링크는 크게 감사하겠습니다.
감사합니다.
왜 "(->) Zero"가 유효한 유형입니까? 나는 "x = [something] :: ((->) Zero)하자."와 같이 쓸 수있는 방법을 상상할 수 없다. 나는 이해하고 있기를 바란다. 답변 해주셔서 감사합니다! – crockeea
@Eric'(->) Zero'는 유효한 유형이 아니며 * 유형 생성자 *입니다.이 유형은 구체 유형을 형성하기 위해 다른 유형에 적용해야합니다. 'Maybe '도 마찬가지입니다. 'Maybe' 타입의 값은 없지만'Maybe Int','Maybe [Double]','Maybe (Maybe (Maybe Char)) '등의 값이 있습니다. 마찬가지로' (->) Zero'가 있지만'(->) Zero Zero' 즉 'Zero -> Zero' 타입의 값이 있습니다. – Ben
감사합니다. 중위 접두사 표기법이 빠졌 습니다만 지금은 분명합니다! – crockeea