User Tools

Site Tools


study:haskell:ch6

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
study:haskell:ch6 [2014/01/13 14:19]
jdj [When do overlapping instances cause problems?]
study:haskell:ch6 [2019/02/04 14:26] (current)
Line 1023: Line 1023:
 ------------------------------------------------- -------------------------------------------------
  
-instance 구현 오버랩핑은 ​제 사용할??+instance 구현 오버랩핑은 ​제 문제를 발생시킬까?
  
 <​code>​ <​code>​
Line 1101: Line 1101:
  
  
---------------------------------------------------------+-----------------------------------------
 -- When do overlapping instances matter? -- When do overlapping instances matter?
 언제 instance 오버랩핑이 중요할까?​ 언제 instance 오버랩핑이 중요할까?​
Line 1109: Line 1109:
 타입클래스의 영향을 받는 메서드를 시도하려고 할때, 타입클래스의 영향을 받는 메서드를 시도하려고 할때,
 어느 instance 를 사용할지 선택을 강요할때 발생한다...????​ 어느 instance 를 사용할지 선택을 강요할때 발생한다...????​
-코드 자체에서 컴파일 에러가 나는 것이 아니라,​ +(->코드 자체에서 컴파일 에러가 나는 것이 아니라,​ 
-  런타임시 애매한 상황에서 선택을 강요받을때 에러가 난다는 말인듯;  +런타임시 애매한 상황에서 선택을 강요받을때 에러가 난다는 말인듯; ​) 
---------------------------------------------------------+-----------------------------------------
  
  
Line 1118: Line 1118:
 -------------------------------------------------- --------------------------------------------------
  
-{- 
 보통, 다형성 타입을 위한 특수한 버전에 타입클래스 instance 를 작성할 수 없다. 보통, 다형성 타입을 위한 특수한 버전에 타입클래스 instance 를 작성할 수 없다.
 [Char] 타입은 다형성 타입 [a] 를 Char 타입으로 상세화시킨 것이다. [Char] 타입은 다형성 타입 [a] 를 Char 타입으로 상세화시킨 것이다.
Line 1138: Line 1137:
 -} -}
  
----------------------------------------------------------------------+<​code>​
 -- file: ch06/​SimpleClass.hs -- file: ch06/​SimpleClass.hs
 {-# LANGUAGE TypeSynonymInstances,​ OverlappingInstances #-} {-# LANGUAGE TypeSynonymInstances,​ OverlappingInstances #-}
Line 1155: Line 1154:
 instance Foo String where instance Foo String where
     foo = id     foo = id
---------------------------------------------------------------------- +</​code>​
-{-+
  
-String == [Char] < [a]+소스 첫줄에 언어확장 주석을 첨부하였기 때문에,
  
-foo 에 String 을 적용하면,​ +[a] 타입의 instance ​가 구현되었고,
-컴파일러가 String specific(구체적인) ​구현을 사용하게 될 것이다.+
  
-심지어 ​[a] 와 Char 로 foo instance ​가 구현되어 있 +밑에 좀 더 구체적인 ​[Char](==String) 타입이 오버랩 되서 ​instance 구현이 었지만, 에러는 안난. 
-String ​에 대한 instance ​가 더 specific(범위가 좁은거?​) ​한 것임으로,​ + 
-GHC 는 을 사용한다. +foo 에 String 을 적용하면,​ 
-다른 타입의 리스트에 대해서는 [a] 로 선택될 것이다.+컴파일러가 String ​specific한 ​(더 구체적고 잘맞는) 구현을 사용하게 ​될 것이다.
  
-OverlappingInstances 언어확장을 켜면, 
 GHC 는 같은정도의 specific instance 를 하나이상 발견시 GHC 는 같은정도의 specific instance 를 하나이상 발견시
 코드를 거부(?​)할 것이다. 코드를 거부(?​)할 것이다.
Line 1195: Line 1191:
 그러나, 사용자가 특정 언어 확장을 사용할 필요는 없다. 그러나, 사용자가 특정 언어 확장을 사용할 필요는 없다.
 -------------------------------------------------------------------- --------------------------------------------------------------------
--} 
- 
  
 -------------------------------------- --------------------------------------
 ====== How does show work for strings? ====== ====== How does show work for strings? ======
 -------------------------------------- --------------------------------------
-{- 
  
 show 함수는 string에 어떻게 작동할까?​ show 함수는 string에 어떻게 작동할까?​
Line 1230: Line 1223:
 OverlappingInstances 확장 필요없이도 가능하다. OverlappingInstances 확장 필요없이도 가능하다.
  
--} 
  
  
Line 1237: Line 1229:
 ====== How to give a type a new identity ====== ====== How to give a type a new identity ======
 --------------------------------------------------------------------- ---------------------------------------------------------------------
-{- 
  
-http://​www.haskell.org/​haskellwiki/​Newtype 설명+http://​www.haskell.org/​haskellwiki/​Newtype 설명을 참조하였음.
  
 data 와 newtype 은 거의 똑같다. data 와 newtype 은 거의 똑같다.
Line 1246: Line 1237:
 data 자리에 newtype 을 넣으려면,​ data 자리에 newtype 을 넣으려면,​
 오직 1개의 생성자만 있어야 한다. 오직 1개의 생성자만 있어야 한다.
 +...
  
-... 읽어볼만함 
  
--} +<​code>​
- +
----------------------------------------------------------------------+
 -- file: ch06/​Newtype.hs -- file: ch06/​Newtype.hs
 data DataInt = D Int data DataInt = D Int
Line 1262: Line 1251:
 newtype NewtypeInt = N Int newtype NewtypeInt = N Int
     deriving (Eq, Ord, Show)     deriving (Eq, Ord, Show)
---------------------------------------------------------------------- +</​code>​
-{- +
-newtype 의 목적은 이미 존재하는 타입에 새이름을 지어주는 것이다.+
  
 --------------------------------------------------------------------- ---------------------------------------------------------------------
 -- The type and newtype keywords -- The type and newtype keywords
 비록 이름이 비슷하지만,​ type 과 newtype 키워드는 다른 목적을 가진다. 비록 이름이 비슷하지만,​ type 과 newtype 키워드는 다른 목적을 가진다.
-type 키워드는 타입을 참조하는 또다른 방법을 제공한다. 닉네임 같은. 
  
-우리나 컴파러나 [Char] 와 String 이 같은 ​타입임을 알고 있다.+type 키워드는 ​종의 닉네임같은 ​참조를 제공한다.
  
 이와 반대로, newtype 은 기본 타입을 숨긴다?​!. 이와 반대로, newtype 은 기본 타입을 숨긴다?​!.
 UniqueID 타입을 보자. UniqueID 타입을 보자.
 +<​code>​
 -- file: ch06/​Newtype.hs -- file: ch06/​Newtype.hs
 newtype UniqueID = UniqueID Int newtype UniqueID = UniqueID Int
     deriving (Eq)     deriving (Eq)
 +</​code>​
 컴파일러는 Int 와 UniqueID 를 다른 타입으로 본다. 컴파일러는 Int 와 UniqueID 를 다른 타입으로 본다.
 유저로서는 그것이 Int 로 구현됬음을 알 수 없다. 유저로서는 그것이 Int 로 구현됬음을 알 수 없다.
Line 1292: Line 1278:
 동일성, 정렬, 출력은 Int 의 instance 에서 유도하지만,​ 동일성, 정렬, 출력은 Int 의 instance 에서 유도하지만,​
  
-Int 의 Num or Integer instance 구현은 노출하지 않았기 때문에 해당안된다.+Int 의 Num or Integer instance 구현은 노출하지 않았기 때문에 해당되지 않는다.
  
 +<​code>​
 ghci> N 1 < N 2 ghci> N 1 < N 2
 True True
Line 1305: Line 1292:
     In the expression: N 313 + N 37     In the expression: N 313 + N 37
     In the definition of `it': it = N 313 + N 37     In the definition of `it': it = N 313 + N 37
 +</​code>​
  
- +기존타입에서 일부 성질만을 가져와서 기존과는 다른 identity 를 제공한다고 볼 수 있다.
--} +
  
  
Line 1314: Line 1300:
 ====== Differences between data and newtype declarations ====== ====== Differences between data and newtype declarations ======
 --------------------------------------------------------------------- ---------------------------------------------------------------------
-{- 
  
 data 와 newtype 의 차이점 data 와 newtype 의 차이점
Line 1342: Line 1327:
 undefined 에 관한 패턴매칭시 newtype 과 data 의 결과가 다르다. undefined 에 관한 패턴매칭시 newtype 과 data 의 결과가 다르다.
  
--------------------------------------------------------+<​code>​
 ghci> undefined ghci> undefined
 *** Exception: Prelude.undefined *** Exception: Prelude.undefined
Line 1348: Line 1333:
 ghci> case D undefined of D _ -> 1 ghci> case D undefined of D _ -> 1
 1 1
--------------------------------------------------------+</​code>​
  
 패턴미칭이 생성자를 통해서 이루어짐으로,​ 패턴미칭이 생성자를 통해서 이루어짐으로,​
Line 1354: Line 1339:
 만약 보호되지 않은 undefined 를 바로 사용하면 에러가 발생한다. 만약 보호되지 않은 undefined 를 바로 사용하면 에러가 발생한다.
  
-------------------------------------------------------+<​code>​
 ghci> case undefined of D _ -> 1 ghci> case undefined of D _ -> 1
 *** Exception: Prelude.undefined *** Exception: Prelude.undefined
-------------------------------------------------------+</​code>​
  
 하지만, newtype 의 경우, 하지만, newtype 의 경우,
  
------------------------------------------------------+<​code>​
 ghci> case N undefined of N _ -> 1 ghci> case N undefined of N _ -> 1
 1 1
 ghci> case undefined of N _ -> 1 ghci> case undefined of N _ -> 1
 1 1
------------------------------------------------------+</​code>​
  
 에러가 안났다!!! 에러가 안났다!!!
Line 1372: Line 1357:
  
 실재로 N _ -> 패턴매칭은 _ -> 와 사실상 같다. 실재로 N _ -> 패턴매칭은 _ -> 와 사실상 같다.
 +
 +(이부분은 좀 더... 공부해야 될 거 같네요 -_-; 이해가 잘... newtype 으로 선언한 타입의 경우,
 +
 +실제로 생성자 체크를 런타임에도 하지 않기 때문에 더 효율적이라고 하는거 같은데...흠)
  
  
Line 1377: Line 1366:
 ====== JSON typeclasses without overlapping instances ====== ====== JSON typeclasses without overlapping instances ======
 --------------------------------------------------------------------- ---------------------------------------------------------------------
 +
 +
 +마지막 소챕터... 준비중 ㅜㅜ
study/haskell/ch6.1389622757.txt.gz · Last modified: 2019/02/04 14:26 (external edit)