![](/img/trans.png)
[英]Haskell list comprehension type error: Couldn't match expected type ‘Float’ with actual type ‘Int’
[英]Haskell couldn't match expected type float with actual type 'a'
嘗試將元組的兩個部分組合在一起時,我遇到了一個問題
功能類型:
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)))
在輸入格式(,)的格式元組和格式(,)的元組時,它應該計算兩個坐標之間的距離。 但是在發布時我得到一個錯誤:
Couldn't match expected type 'Float' with actual type 'a'
a is a rigid type variable bound by...
我明白為什么會出現問題,但我不知道如何解決它
你的類型錯了。 正如在評論中提到的那樣,你有一個類型為Floating
的類型,並且正在調用fromIntegral
。
Prelude> :t fromIntegral
fromIntegral :: (Num b, Integral a) => a -> b
您不能擁有Floating
Integral
,因此失敗。 你的類型應該是:
close :: Integral a => (a, a) -> (a, a) -> Float
請注意,您也不需要盡可能多的fromIntegral
調用,因為(^)
操作(Num a, Integral b) => a -> b -> a
,任何數字都可以作為基數。 唯一重要的操作是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
一種幫助您調試的技術是注釋掉您的類型簽名並詢問系統類型。 在ghci中,那將是:t close
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.