2010-11-25 6 views
2

나는 하스켈의 기초를 배우고 있으며,이 간단한 질문에 대한 답을 찾기 위해 노력했다. 그래서 나는 그것이 간단하다고 확신하기 때문에 미리 사과한다.하스켈에서 타입 비교

을 감안할 때 :

data Fruit = Fruit| Apple | Orange 
    deriving (Show, Eq) 

a = Apple 

어떻게 어떤 A는 과일인지 확인합니까?

+0

를 사용하면 GHCi를 사용하는 경우 그런데

fruitName :: Fruit -> String fruitName Fruit = "Fruit" fruitName Apple = "Apple" fruitName Orange = "Orange" 

, 당신은 어떤 유형을 알고 싶어 그렇게하려면, 패턴 매칭을 사용 왜 당신이 이것을 원하는지 정확히 알기. – sclv

+0

@sclv : 위의 프로그램에서 a == Apple은 True를 반환합니다. 과일 = False를 반환합니다. 나는 단지 변수가 과일인지 어떻게 알 수 있는지 알고 싶다. 복잡한 것은 없습니다. 사과 == 과일도 거짓을 반환합니다. 데이터와 유형 생성자가 모두 같은 이름이기 때문에 혼란 스러울 수도 있습니다. Ok, 데이터 FruitType을 데이터 FruitType ...으로 바꿉니다. FruitType과 관련이 있는지 확인하는 방법을 찾을 수 없습니다. –

답변

9

유형을으로 가정하면 간단한 대답은 "할 수 없습니다"입니다. Haskell은 정적으로 타입이 정해져 있으므로 컴파일 타임에 실행 시간이 아닌 체크가 수행됩니다. 그래서, 당신은 이런 기능이있는 경우 :

foo :: Fruit -> Bool 
foo Apple = True 
foo x  = False 

여부 x의 대답은 항상 "예"가 될 것입니다 과일입니다.

당신이하려는 것은 주어진 값이 생성 된 데이터 생성자를 찾는 것입니다. 내가 관심이있을 거라고 :t

> let a = 123 
> :t a 
a :: Integer 
> 
+0

@Joey Adams : 저는 Apple이 있습니다. 데이터 생성자 인 Fruit (형식 생성자, Apple과는 반대)을 반환하는 함수를 원합니다 ... 그래서 그것의 소리에서 나는 패턴 매칭을 수행하고, 예를 들어, Prelude에는 아무 것도 없지만 fruitName Apple = "Apple"대신 fruitName Apple = "Apple"을 사용하여 데이터 생성자 이름을 결정하기 위해 직접 함수를 만들 수 있습니까? –

+0

@ 리차드 하인 : 이것을 보관하려면'Typeable'을 사용할 수 있습니다. 그러나 그것은 악합니다. – fuz

+0

@Joey Adams : GHCi에서 내 질문에 작은 프로그램을로드하고 a를 입력하면 "a :: Fruit"이 표시됩니다. 똑같은 것을 반환하는 함수를 원한다. type은 GHCi에서한다. –