Haskell 哈斯克尔不能';t将预期类型浮动与实际类型';a';
我在尝试将元组的两个部分相加时遇到了一个问题 功能类型:Haskell 哈斯克尔不能';t将预期类型浮动与实际类型';a';,haskell,types,type-mismatch,Haskell,Types,Type Mismatch,我在尝试将元组的两个部分相加时遇到了一个问题 功能类型: 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))) 在向函数提供格式为(,)的y元组和格式为(,)的x元组时,它应
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)))
在向函数提供格式为(,)的y元组和格式为(,)的x元组时,它应计算两个坐标之间的距离。
但是,在启动时,我得到一个错误:
Couldn't match expected type 'Float' with actual type 'a'
a is a rigid type variable bound by...
我确实理解为什么会出现这个问题,但我不知道如何解决它。帮助您调试的一种技术是注释掉您的类型签名,并询问系统类型是什么。在ghci中,这将是
:t close
你的类型不对。正如Redu在评论中提到的,您在typeclassFloating
下有一个类型,并且正在对其调用fromIntegral
Prelude> :t fromIntegral
fromIntegral :: (Num b, Integral a) => a -> b
您不能使用浮点
整数
,因此此操作失败。您的类型应为:
close :: Integral a => (a, a) -> (a, a) -> Float
请注意,您也不需要从Integral调用中调用那么多的,因为(^)
操作(numa,Integral b)=>a->b->a
,任何数字都可以作为基础。唯一重要的操作是sqrt
,它需要浮动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
您在类型定义中提到浮动a
,然后在函数中使用相同的a
类型(该类型应属于积分
类型类)从Integral
馈送。。。这是一个冲突。您需要一个函数Floating a=>a->Float
来生成结果。我希望close::浮动a=>(a,a)->(a,a)->a
,或者close:(积分a,浮动b)=>(a,a)->(a,a)->b
。Ord
和Float
从哪里来?@molbdnilo也许他想从输出中得到一个具体的Float
。@molbdnilo是的,我不知道为什么我有Float。。。。我想我只是没有意识到我可以用a作为float的模棱两可的形式给我‘Floating a=>(a,a)->(a,a)->a’,这基本上就是我作为我的type@MaxUmarovs您对close
的定义没有该类型,但(浮动a1、积分b、积分b1、积分a、积分a2)=>(a2、b1)->(a、b)->a1
@MaxUmarovs你错过了他说要注释掉你的类型签名的那部分。