在寻找多变量函数示例时,我发现了这个资源: StackOverflow:如何创建多变量 haskell 函数?,并且有一个这样的答案片段:
class SumRes r where
sumOf :: Integer -> r
instance SumRes Integer where
sumOf = id
instance (Integral a, SumRes r) => SumRes (a -> r) where
sumOf x = sumOf . (x +) . toInteger
然后我们可以使用:
*Main> sumOf 1 :: Integer
1
*Main> sumOf 1 4 7 10 :: Integer
22
*Main> sumOf 1 4 7 10 0 0 :: Integer
22
*Main> sumOf 1 4 7 10 2 5 8 22 :: Integer
59
出于好奇,我尝试对其进行了一些更改,因为乍一看我发现它非常棘手,因此我进入了这个:
class SumRes r where
sumOf :: Int -> r
instance SumRes Int where
sumOf = id
instance (SumRes r) => SumRes (Int -> r) where
sumOf x = sumOf . (x +)
我只是更改Integer
为Int
并instance (Integral a, SumRes r) => SumRes (a -> r) where
减少了多态性instance (SumRes r) => SumRes (Int -> r) where
要编译它,我必须设置XFlexibleInstances
标志。当我尝试测试sumOf
功能时,我遇到了一个问题:
*Main> sumOf 1 :: Int
1
*Main> sumOf 1 1 :: Int
<interactive>:9:9
No instance for (Num a0) arising from the literal `1'
The type variable `a0' is ambiguous...
然后我尝试了:
*Main> sumOf (1 :: Int) (1 :: Int) :: Int
2
考虑到我们在类型类中使用,为什么 Haskell 不能Int
在这种情况下推断出我们想要一个?Int
SumRes