为什么String不能在约束中使用?

时间:2016-09-20 18:12:23

标签: haskell

为什么我无法设置$number = $_POST["NR"]; $i = 0; while ($i < 40) { $picture = $number + $i.".jpg"; echo '<img src="pictures/' . $picture . ' ">'; $i++; } 约束,但String工作正常?

这有效:

Num

这不是:

ltest' :: (Num a) => a -> a
ltest' a = (\b -> b * 2) a

错误:

test' :: (String a) => a -> a
test' a = a ++ " good job"

1 个答案:

答案 0 :(得分:12)

String是一种类型:

type String = [Char]

Num是一个类:

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

这意味着它适用于具有a类实例的任何类型Num

您的test'不需要类型参数,因为它只适用于一种类型 2 (参数只能是String类型)。所以它也不需要任何约束,因为没有要约束的类型参数。

test' :: String -> String
test' a = a ++ " good job"

1 换句话说,ltest'具有多态类型。

2 换句话说,test'具有单态类型。