簡體   English   中英

Haskell無法將預期類型的​​float與實際類型'a'匹配

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM