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
是一种类型,不是对某些类型的约束。