2014-10-13 4 views
3

디버깅을 시도하고 있으며 값의 유형을 반환하는 함수를 얻을 수 있기를 원합니다. 그런 것이 가능합니까?haskell에서 값 유형을 얻는 방법

나는 wan't 해달라고 : t, 내가

같은 코드에서 사용할 수있는 뭔가 wan't :

[showType i | i <- [0..5] ] 

수익을

[Int,Int,Int,Int,Int] 
+4

형식과 값은 다른 네임 스페이스에 있습니다. 일부 리플렉션을 사용하여 정보를 얻을 수는 있지만, 모든 유형이 컴파일 타임에 알려 져야하기 때문에 다소 제한적입니다. 유형 목록으로 무엇을하려합니까? – bheklilr

+0

또 다른 생각 :'[Int, Int, Int, Int, Int]'의 유형은 무엇입니까? 하스켈이 친절한 레벨리스트를 가지고 있다고 생각하지 않습니다. 왜냐하면'Int'는 친절한'*'을 가지고 있기 때문에 당신은''* ''라고 말할 수 있습니다. – bheklilr

+0

디버깅을 원할 것 같으니'GHCi'가': t'로 알려줄 수 있습니다. Emacs의 ghc-mod는 또한 표현의 유형을 줄 수 있습니다. – gspr

답변

8

Typeable 클래스는 각 인코딩 유형은 컴파일 타임에 유일하게이 용도로 사용할 수 있습니다.

import Data.Typeable 

showType :: Typeable a => a -> String 
showType = show . typeOf 
의 결과에

는 :

*Main> showType (+) 
"Integer -> Integer -> Integer" 
*Main> showType [1..5] 
"[Integer]" 
*Main> map showType [1..5] 
["Integer","Integer","Integer","Integer","Integer"] 

이 모든

은 Bheklilr이 옳다 말했다. 실제로 원하는 것이 다른 것일 수 있으므로 더 많은 정보가 도움이 될 것입니다.

+0

이것은 내가 필요한 것입니다. 컴파일 할 때 오류를 잡아내는 것만으로는 오류가 발생하기도합니다. 이드는 오히려 이런 식으로 정보를 얻는다. 그것은 완벽하지 않을 수도 있습니다 (나는 결국이 버그를 찾았습니다)하지만 적어도 그것이 가능한지보고 싶었습니다. – ditoslav

4

아마도 TypedHoles과 같은 것을 원할 수도 있습니다. 그것은 당신이 어떤 표현 대신에 _을 쓸 수있게 해주고, 컴파일러는이 "구멍"이 가지고 있거나 가지고 있어야하는 타입을 알려줄 것입니다.

+1

이 질문은 대답보다 더 좋은 의견이라고 생각합니다. – bheklilr

관련 문제