2017-11-02 7 views
3

저는 하스켈을 처음 접했고 newtype을 사용하여 무엇이 무엇인지 말할 수 있기를 원하지만 문자열에서 읽어야합니다. 나는Haskell 인스턴스가 단지 int 인 newtype을 읽었습니다.

newtype SpecialId Int 
    deriving (Eq, Ord, Show) 

은 내가 newtype이란에서 읽기를 유도 그것이 단지 read "SpecialId 5" :: SpecialId에서 작동 작동하지 않을 경우 read "5" :: SpecialId 할 수 있도록하려는있다. 나는

instance Read SpecialId where 
    readsPrec _ s = read s 

을 시도했지만 -XDerivingStrategies를 사용 GHC 8.2 이후이 나에게

SpecialId *** Exception: Prelude.read: no parse 
+0

Haskell에게'read'를 요구하고,'[(SpecialId, String)]'을 읽습니다. 이것은''[ ''char로 시작하지 않기 때문에 실패합니다. –

+3

새 유형을 정의하는 구문이 잘못되었습니다. newtype SpecialId = SpecialId Int derived (Eq, Ord, Show)이어야합니다. – chepner

답변

8

이 가능하다을 제공합니다

{-# LANGUAGE GeneralizedNewtypeDeriving #-} 
{-# LANGUAGE DerivingStrategies   #-} 

newtype SpecialId = SpecialId Int 
    deriving stock (Eq, Ord, Show) 
    deriving newtype Read 

ghci에서 :

ghci> read "5" :: SpecialId 
SpecialId 5 
5

당신은 돈 ' 언어가 필요 없다. ension 수동으로 Int 인스턴스에 전달하고자하는 경우 : 외모에도 불구하고

instance Read SpecialId where 
    readsPrec n s = [ (SpecialId x, y) | (x, y) <- readsPrec n s ] 

readsPrec의 재귀 사용되지 않습니다 : 우리는 우리가 사용 (Int, String)쌍 목록을 가져올 수 readsPrecInt 버전을 호출 Int을 모두 감싸는 목록 내역은 SpecialId입니다.