gpt4 book ai didi

haskell - (Num a) vs 整数类型推断

转载 作者:行者123 更新时间:2023-12-03 15:27:45 24 4
gpt4 key购买 nike

考虑以下 Haskell 函数:

sign a
| a < 0 = (-1)
| a > 0 = 1
| otherwise = 0

当我将它加载到 ghci 中时,我期望 :t sign成为:
sign :: (Num a, Ord a) => a -> Integer

相反,它推断为:
*Main> :t sign
sign :: (Num a1, Num a, Ord a1) => a1 -> a

同样,如果我询问整数的类型 5 , 我预计 Integer ,但我得到了
*Main> :t 5
5 :: Num a => a

我对 Haskell 的类型有些不理解。问题是,如果我只知道 sign 的返回类型是它是 Num 的一个实例吗? typeclass,那么我应该不能将它的返回值传递给这个函数:
double :: Integer -> Integer
double x = x * 2

也就是我的 double函数需要 Integer ,而不仅仅是 Num 的任何实例.

然而,以下工作很好:
*Main> double (sign 5.5)
2

我对 Haskell 的类型系统有什么误解?

最佳答案

The thing is, if all I know about the return type of 'sign' is that it is an instance of the Num typeclass, then I should not be able to pass its return value into this function:



对,如果你只知道这些,你就不能把它传给 double .

但是类型
sign :: (Num a1, Num a, Ord a1) => a1 -> a

表示 sign 的结果类型是 Num 中的任何一个键入调用者的要求。类型签名中的类型变量是(隐式)普遍量化的,而不是存在的,例如Java 接口(interface)。
sign可以产生任意类型的返回值,受限制它是 Num 的实例,它返回的类型由调用上下文决定。

如果来电者想要 Integer ,它得到一个。如果它想要 Double ,也没有问题。

一开始忘了说:

Similarly, if I ask for the type of the integer 5, I expected "Integer", but instead I got


    *Main> :t 5
5 :: Num a => a

数字文字是多态的,整数文字代表 fromInteger value ,以及 fromRational value 的小数文字.

关于haskell - (Num a) vs 整数类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15448351/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com