2013-03-30 2 views
1

에서 기능 유형을 변경 I가 기본적으로이 유형이 함수 :하스켈

func:: Integer -> (Integer,Integer) -> [[String]] -> ([Char],[Char],[Char],[Char]) -> (Int,Int) 

:

func :: Integer -> (Integer,Integer) -> [[String]] -> ([Char],[Char],[Char],[Char]) -> (Integer,Integer) 

그러나 나는 내가 쓴 때 (INT, int)를 반환 할을 홈페이지> : L 플레이

ERROR "play.hs":64 - Type error in explicitly typed binding 
*** Term   : func 
*** Type   : Integer -> (Integer,Integer) -> [[String]] -> ([Char],[Char],[Char],[Char]) -> (Integer,Integer) 
*** Does not match : Integer -> (Integer,Integer) -> [[String]] -> ([Char],[Char],[Char],[Char]) -> (Int,Int) 

어떻게이 문제를 해결할 수 있습니다 나는이 오류가? 감사.

+0

'Int'는 '정수'가 아닙니다. 하스켈은 숫자 타입 사이의 암묵적인 변환을 가지고 있지 않습니다. – nymk

+0

@nymk 해결할 제안이 있으십니까? 감사. – jason

답변

3

func을 래핑하는 새 래퍼 함수를 ​​작성한 다음 대신 래퍼 함수를 ​​사용하십시오.

func' :: Integer -> 
     (Integer,Integer) -> 
     [[String]] -> 
     ([Char],[Char],[Char],[Char]) -> 
     (Int,Int) 
func' a b c d = (fromInteger x, fromInteger y) where 
    (x, y) = func a b c d 

또는 직접 funcfromInteger에 대한 호출을 삽입 할 수 있습니다.

여기서 문제는 IntInteger이 서로 다른 유형이며 컴파일러가 암시 적으로 변환하지 않는다는 것입니다. 따라서 명시 적으로 수행해야하므로 fromInteger을 호출해야합니다. fromIntegerInteger을 숫자 유형으로 변환합니다.