不,你的类型签名,实际上是
forall a b. (Eq a, Eq b) => a -> b
意味着你的函数必须可以调用any types a
and b
,由下式确定呼叫站点,只要两者都是实例Eq
.
决定返回什么类型的不是您的函数。这是你的函数use这决定了。
所以你应该能够写
let { i :: Int; i = 1;
n :: Integer; y :: Double;
n = foo i; -- foo :: Int -> Integer
y = foo i -- foo :: Int -> Double
}
正如您所看到的,您的函数的唯一实现是no执行:
foo _ = x where {x = x}
因为你没有办法产生一个值any您需要的类型。这种类型可以是任何东西,而你无法了解它的任何情况。
顺便一提other类型类实际上可能允许您定义某物在这里,像
foo :: (Enum a, Enum b, Bounded a, Bounded b) => a -> b
foo a = snd . last $ zip [minBound .. a] (cycle [minBound ..])
我并不是说这是一个合理的定义,只是说它是可能的:
> foo () :: Bool
False
> foo True :: Int
-9223372036854775807
> foo (0 :: Int) :: Bool
Interrupted.
对于来自更常用语言的程序员来说,认为这可能是一个常见的误解foo :: (Eq a) => a
意思是“我要定义foo
返回我想要的任何类型,只要它在Eq
“。事实并非如此。:)