Haskell Variadic函数和实例声明

me2*_*me2 3 haskell types

我试图理解这个关于可变函数的问题的例子,并尝试修改代码:

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
Run Code Online (Sandbox Code Playgroud)

对此:

class SumRes r where 
    sumOf :: Int -> r

instance SumRes Int where
    sumOf = id

instance (SumRes r) => SumRes (Int -> r) where
    sumOf x = sumOf . (x +) 
Run Code Online (Sandbox Code Playgroud)

我得到了Illegal instance declaration for SumRes (Int -> r).有人可以解释这意味着什么,我反对的约束是什么?

Tik*_*vis 5

你刚刚达到了Haskell标准的极限.标准Haskell仅允许一组受限制的实例声明.特别地,所有实例都必须是"简单的",因为它们是应用于零个或多个类型变量的类型.

这意味着您可以拥有实例Int,MaybeMaybe a.但是,您不能拥有类似的实例Maybe Int.这就是你遇到的问题:你的实例有一个type(->)Int和一个变量.

但是,尽管此行为不符合标准,但它仍然有意义,因此您可以使用扩展名启用它.这就是做什么FlexibleInstances,明显的警告是你的代码不再是标准的Haskell.