Haskell 为什么不能在约束中使用字符串?
为什么我不能设置Haskell 为什么不能在约束中使用字符串?,haskell,Haskell,为什么我不能设置String约束,但Num却可以正常工作 这项工作: ltest' :: (Num a) => a -> a ltest' a = (\b -> b * 2) a 这并不是: test' :: (String a) => a -> a test' a = a ++ " good job" 错误: • Expecting one fewer argument to ‘String’ Expected kind ‘* -> Constrai
String
约束,但Num
却可以正常工作
这项工作:
ltest' :: (Num a) => a -> a
ltest' a = (\b -> b * 2) a
这并不是:
test' :: (String a) => a -> a
test' a = a ++ " good job"
错误:
• Expecting one fewer argument to ‘String’
Expected kind ‘* -> Constraint’, but ‘String’ has kind ‘*’
• In the type signature:
test' :: (String a) => a -> a
是一种类型:
type String = [Char]
是一个类:
class Num a where
(+), (-), (*) :: a -> a -> a
negate :: a -> a
abs :: a -> a
signum :: a -> a
fromInteger :: Integer -> a
negate x = 0 - x
约束只涉及类,不涉及类型
您的ltest'
有一个类型参数a
。1这可以明确表示为:
ltest' :: forall a. (Num a) => a -> a
这意味着它可以与具有Num
类实例的任何类型a
一起使用
您的测试'
不需要类型参数,因为它只适用于一种类型2(参数只能是字符串类型
)。所以它也不需要任何约束,因为没有要约束的类型参数
test' :: String -> String
test' a = a ++ " good job"
1换句话说,
ltest'
具有多态类型
2换句话说,
test'
具有单态类型。谢谢!我想确保您只将字符串值作为函数param传递,比如C中的函数x(char a){},这是通过将类型声明为String->String
来实现的。因此,没有办法得到这样的值(String a)=>a->a?我很困惑-您希望它做什么?@vodich no,因为String
是一种类型,不是对某些类型的约束。