Haskell中如何实现类型签名为Num a => a -> Bool -> a的One函数
类型签名解析与函数实现
首先明确这个类型签名One :: Num a => a -> Bool -> a的含义:
- 约束
Num a说明第一个参数和返回值都属于数值类型类,支持所有数值通用操作 - 函数一共接收两个入参:第一个是任意数值类型的变量,第二个是布尔类型变量,最终返回和第一个入参同类型的数值
你不需要纠结「数值类型和布尔类型怎么交互」,Haskell本身不支持布尔和数值的隐式类型转换,你只需要通过模式匹配或者分支判断,根据第二个布尔参数的取值,选择要返回的数值即可,常见实现有以下几种:
实现1:布尔为True返回第一个入参,False返回0
这是最通用的场景实现,比如要做条件累加的场景就可以直接用这个:
One :: Num a => a -> Bool -> a One x True = x One _ False = 0
调用示例:
One 3 True返回3One 9 False返回0
实现2:布尔为True返回1,False返回第一个入参
适合需要把布尔值映射为1参与计算的场景:
One :: Num a => a -> Bool -> a One _ True = 1 One x False = x
调用示例:
One 5 True返回1One 5 False返回5
实现3:用if表达式简化写法
和实现1逻辑完全一致,只是写法不同:
One :: Num a => a -> Bool -> a One x b = if b then x else 0
你可以根据自己的实际业务需求调整两个分支返回的数值,只要符合Num类型类的要求即可,不需要做任何类型转换操作。
内容的提问来源于stack exchange,提问作者maros
相关产品推荐
相关产品推荐

