2017-11-13 1 views
3

내가 문제로 실행 한 함께하스켈은 실제의 형태와 예상 float 형과 일치하지 수 '는'튜플의 두 파트를 추가 할 때

기능 유형 :

close :: (Floating a, Ord a) => (a,a) -> (a,a) -> Float 

기능 정의 : 포맷

close y x = sqrt (((fromIntegral(snd x) - fromIntegral(snd y))^2) + ((fromIntegral(fst x) - fromIntegral(fst y)^2))) 

포맷의 함수 AY 튜플 공급 ON() 및 도끼 튜플()는 두 좌표 사이의 거리를 계산한다. 그러나 발사에 나는의 오류 얻을 : 문제가 발생하는 이유를 이해 할

Couldn't match expected type 'Float' with actual type 'a' 
a is a rigid type variable bound by... 

을,하지만 난 당신이 언급하는 것입니다 디버깅하기 위해 그것을

+2

당신이 언급'충돌이다 ...'Integral' 형 클래스에 속하도록되어 같은'A' 종류와 기능에'fromIntegral' 먹이를 입력 한 다음 정의에 A' 부동합니다. – Redu

+0

결과를 생성하려면'Floating a => a -> Float' 함수가 필요합니다. 나는 close :: Floating a => (a, a) -> a' 또는 close :: (Integral a, Floating b) => (a, a) -> a, a) -> b'. 'Ord'와'Float'는 어디에서 왔습니까? – molbdnilo

+0

@molbdnilo 어쩌면 출력에서 ​​콘크리트 'Float'을 원하겠습니까? –

답변

2

유형이 잘못되었습니다. Redu가 주석에 언급 했으므로, 유형이 Floating 인 typeclass이고 fromIntegral을 호출합니다.

Prelude> :t fromIntegral 
fromIntegral :: (Num b, Integral a) => a -> b 

당신은 FloatingIntegral을 가질 수 없습니다, 그래서 이것은 실패합니다. 당신의 유형은 대신해야한다 : 당신은 또한 (^)(Num a, Integral b) => a -> b -> a에서 작동하기 때문에, 어떤 번호가 기본이 될 수있는, 많은 fromIntegral 통화를하지 않아도

close :: Integral a => (a, a) -> (a, a) -> Float 

참고. 중요한 작업은 sqrt이며 Floating a이 필요합니다.

close :: Integral a => (a, a) -> (a, a) -> Float 
close (x1, y1) (x2, y2) = sqrt . fromIntegral $ squaredDistance where 
    squaredDistance = (x1 - x2)^2 + (y1 - y2)^2 
0

한 기술을 해결하는 방법을 몰라 당신의 타입 시그니처를 제거하고 타입이 무엇인지 시스템에 문의하십시오. ghci에서는 :t close이됩니다.

+0

'Floating a => (a, a) -> (a, a) -> a ' –

+0

기본적으로 내가 가지고있는 타입은 무엇입니까? –

+0

@MaxUmarovs'close'에 대한 정의에는 그 타입이 없지만'(Floating a1, Integral b, Integral b1, Integral a, Integral a2) => (a2, b1) -> (a, b) -> a1'이다. – molbdnilo

관련 문제