gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 21:06:30 24 4
gpt4 key购买 nike

为什么我无法设置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

最佳答案

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'有一个类型参数a1这可以明确表达:

ltest' :: forall a. (Num a) => a -> a

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

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

test' :: String -> String
test' a = a ++ " good job"
<小时/>

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

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

关于haskell - 为什么 String 不能在约束中使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39601008/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com