我正在研究一个Haskell问题,试着学习这门语言。我试图递归地将所有元素添加到一个列表中,因此:
[5,5] -> 10 and [5.0, 5.0] -> 10.0
我知道如何递归地解决这个问题,但我的问题是,在定义函数时,如何处理Ints和Float?现在我有:
add :: [Int] -> Int
不适用于浮子。提前谢谢你的帮助。
发布于 2022-10-01 20:07:24
正如评论中所指出的,您正在寻找一个典型的类型化。在这种情况下,由于您希望将数字相加在一起,所以需要Num
类型,它提供了加法函数。
(+) :: Num a => a -> a -> a
所以你的签名应该看起来像
add :: Num a => [a] -> a
并且可以递归地编写该函数。
add [] = 0
add (x:xs) = x + add xs
注意,整数文本(如本例中的0
)在内部被视为Num a => a
。实际上,Haskell编译器将把number 0
编译成fromInteger (0 :: Integer)
,其中fromInteger
是Num
类型中的另一个函数。因此,整数文字是多态的。
最后,虽然这个实现没有什么问题,但是您要查看的函数实际上是内置到Haskell的。它叫sum
。
sum :: (Foldable t, Num a) => t a => a
请注意,Foldable
是一个典型的,适合的东西,可以折叠。列表类型[]
是Foldable
的一个示例。
https://stackoverflow.com/questions/73923040
复制