Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 哈斯克尔不能';t将预期类型浮动与实际类型';a';_Haskell_Types_Type Mismatch - Fatal编程技术网

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在评论中提到的,您在typeclass
Floating
下有一个类型,并且正在对其调用
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你错过了他说要注释掉你的类型签名的那部分。