首页 > 解决方案 > 关于函数中的返回名称

问题描述

为什么这不起作用?

summ :: (Num a) => [a] -> Int

summ [] = 0;

summ (x:list) = x + summ list


是因为不确定它x + summ list总是一个 Int 吗?如果a没有Num进行某种转换?

标签: haskell

解决方案


你利用(+) :: Num a => a -> a -> ain x + summ list。正如类型签名所暗示的,操作数和结果都具有相同的类型。如果你因此有 a xof 类型Num a => a,那么summ list也应该是相同类型a,而不是 a Int

因此,您应该使用:

summ :: Num a => [a] -> a
summ [] = 0
summ (x:list) = x + summ list

作为结果a类型。如果您使用Ints 列表作为参数,那么您将检索 anInt作为结果,如果您使用Integers 列表作为参数,那么这将产生一个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,这样的数字可能会变得任意大,因此可能会导致溢出。


推荐阅读