haskell - 关于函数中的返回名称
问题描述
为什么这不起作用?
summ :: (Num a) => [a] -> Int
summ [] = 0;
summ (x:list) = x + summ list
是因为不确定它x + summ list
总是一个 Int 吗?如果a
没有Num
进行某种转换?
解决方案
你利用(+) :: Num a => a -> a -> a
in x + summ list
。正如类型签名所暗示的,操作数和结果都具有相同的类型。如果你因此有 a x
of 类型Num a => a
,那么summ list
也应该是相同类型a
,而不是 a Int
。
因此,您应该使用:
summ :: Num a => [a] -> a
summ [] = 0
summ (x:list) = x + summ list
作为结果a
类型。如果您使用Int
s 列表作为参数,那么您将检索 anInt
作为结果,如果您使用Integer
s 列表作为参数,那么这将产生一个Integer
.
如果您知道列表中的项目的类型是 typeclass 的成员,则Integral
可以使用 ffromIntegral :: (Integral a, Num b) => a -> b
将它们转换为Int
:
summ :: Integral a => [a] -> Int
summ [] = 0
summ (x:list) = fromIntegral x + summ list
但这可能不是一个好主意,因为如果您使用Integer
,这样的数字可能会变得任意大,因此可能会导致溢出。
推荐阅读
- python - 与 Pandas 交叉连接
- r - 添加 ggsignif 以使用数字 x 轴进行绘图会导致错误“只能处理在 x 轴上绘制的组的数据”
- bash - 如何在 bash 脚本中将 TCL 变量设置为变量
- python - 从与该项目的索引对应的数字中查找列表中的项目?
- c# - 如何将一名球员转移到另一支球队?
- php - Wordpress 的特色图片未出现在管理员中
- open-policy-agent - 在 OPA rego 中使用 OR 条件
- python-3.x - Python subprocess.run()。将所有参数组合成一个字符串?
- java - 学校项目中带有 java.util.scanner 的 NoSuchElementException
- php - 文本区域html内的换行符