48、对于 Haskell 代码定义:a) i :: Num a => a; i = 1 。若尝试将类型签名替换为:i :: a ,会发生什么情况?
原类型签名 i :: Num a => a
表明 i
是一个具有 Num
类型类约束的多态值,可代表任何实现了 Num
类型类的类型。
若将类型签名替换为 i :: a
,移除了 Num
约束,而值 i = 1
是一个具体的数值,需要 Num
类型类支持。
这会导致类型不匹配,编译器会报错,因为无法确定 a
是什么类型,且 1
要求类型实现 Num
类型类。
49、以下两个函数类型声明,一个是指定为Float类型,另一个是更通用的Num类型类约束的类型:a) f :: Float,f = 1.0;b) f :: Num a => a,f = 1.0。分析这两个声明的特点。
- a选项将函数f的类型明确指定为
Float
类型,值为1.0
; - b选项函数f的类型是更通用的,只要是
Num
类型类的实例都可以,值同样为1.0
。
50、a) 函数f的类型为Float,f赋值为1.0;b) 函数f的类型为Fractional类型类约束的多态类型。请分析这两种类型声明的合理性及适用场景。
- 选项a中
f
的类型被明确指定为Float
- 选项b中
f
的类型是Fractional
类型类约束的多态类型 - 由于
Float
是Fractional
类型类的实例,所以两种类型声明都合理,但b更具通用性 - 如果需要更具体的单精度浮点数类型,选a
- 如果需要更灵活的类型,选b
51、在 REPL 中输入 :info RealFrac 后,以下哪种类型表述更能体现与 RealFrac 的关系。选项 a:f 的类型为 Float,f 赋值为 1.0;选项 b:f 的类型为 RealFrac a => a
若为选择更合适类型,选 b,因 RealFrac 是更通用类型类,Float 只是其实例之一。
52、以下两个函数签名选项:a) freud函数类型为 a -> a ,函数定义为 freud x = x;b) freud函数类型为 Ord a => a -> a 。请问在什么情况下应选择a选项,什么情况下应选择b选项?
若选择更通用的类型则为a,若函数实现需要 Ord 约束则选b。
53、以下两个函数签名,一个是 freud' :: a -> a
,另一个是 freud' :: Int -> Int
,对于函数体为 freud' x = x
的函数,选择更合适的签名。
freud' :: a -> a
更合适,因为函数 freud' x = x
只是简单返回传入的参数,没有对参数类型做任何限制, a
可以代表任意类型,比 Int -> Int
(只能处理整数类型)更具通用性。
54、a) 定义 myX 为整数 1,定义函数 sigmund,其类型为 Int -> Int,函数体为返回 myX;b) 判断函数 sigmund 的类型为 a -> a 是否正确。
a) 在 Haskell 中可以这样定义:
let myX = 1
sigmund :: Int -> Int
sigmund _ = myX
b) 该说法错误,函数 sigmund
的类型是 Int -> Int
,它接收一个 Int
类型的参数并返回一个 Int
类型的值,而 a -> a
表示的是可以接收任意类型的值并返回相同类型的值,所以 sigmund
的类型不是 a -> a
。
55、有两种函数签名定义,a) 定义了常量 myX 为整数 1,函数 sigmund’ 接受一个整数参数并返回该整数,函数体返回 myX;b) 函数 sigmund’ 接受一个属于 Num 类型类的参数并返回相同类型的值。请分析这两种定义。
下面是给定的【文本内容】:
- 选项 a 中函数
sigmund'
明确限定参数和返回值类型为Int
,而选项 b 中函数sigmund'
的参数和返回值类型是更宽泛的属于Num
类型类的类型。 - 选项 a 的类型更具体,选项 b 的类型更通用。
56、需要从 Data.List 导入 sort 函数。选项 a:jung 函数类型为 Ord a => [a] -> a,函数实现为 jung xs = head (sort xs);选项 b:jung 函数类型为 [Int] -> Int。请问哪个选项的函数类型更具多态性?
答案为 a