Int a => a -> String
和Int -> String
之间的区别是什么?
成功:
f1 :: Int -> String
错误:
f1 :: Int a => a -> String
f1 n = show n
答案 0 :(得分:3)
Int
是一种具体类型,因此不能用于创建约束。类型类(类型* -> Constraint
)(如Num
)用于创建约束。
你也不需要。约束的目的是指定类似a
的类型变量必须是特定类的实例的类型。像Int a
这样的东西只能表示“a
类型Int
”,并且只有一种类型(惊讶:Int
),这是真的,所以你只需写Int -> String
。
像Num a => a -> String
这样的约束定义了一个函数的类型,该函数接受实现Num
的任何类型的参数,可以是Int
,Integer
,{{1 }},Float
或其他一些合适的类型。