我刚刚开始阅读“了解你是一个很好的Haskell”。在第3章中,我看到作者使用=>但我无法确切地知道它的作用以及它们使用它的原因。
我认为这是第一次使用它:
lucky :: (Integral a) => a -> String
lucky 7 = "LUCKY NUMBER SEVEN!"
lucky x = "Sorry, you're out of luck, pal!"
这是另一个例子:
tell :: (Show a) => [a] -> String
tell [] = "The list is empty"
tell (x:[]) = "The list has one element: " ++ show x
tell (x:y:[]) = "The list has two elements: " ++ show x ++ " and " ++ show y
tell (x:y:_) = "This list is long. The first two elements are: " ++ show x ++ " and " ++ show y
感谢。
答案 0 :(得分:0)
它将参数Integral
约束到某个类,在本例中为Show
和action
答案 1 :(得分:0)
简而言之:
虽然尚未完成,但如果您尚未阅读class
es,则可以将其视为约束,即a
类型上定义了一组函数。
<强>解释强>:
您可以将其视为对类型设置约束。例如,在lucky
:
lucky :: (Integral a) => a -> String
这意味着只要a
是[{1}} 的a
,就可以为任何类型instance
定义函数。
现在我不知道您是否熟悉Integral
es(那些不是面向对象编程中使用的那些),但类或多或少在class
上引入了可以的函数然后在你的函数定义中使用。例如,类a
定义为:
Integral
现在这个类很难理解,因为它在签名中也使用class (Real a, Enum a) => Integral a where
quot :: a -> a -> a
rem :: a -> a -> a
div :: a -> a -> a
mod :: a -> a -> a
quotRem :: a -> a -> (a, a)
divMod :: a -> a -> (a, a)
toInteger :: a -> Integer
。也许更简单的是=>
:
Show
这意味着如果class Show a where
showsPrec :: Int -> a -> ShowS
show :: a -> String
showList :: [a] -> ShowS
是a
的实例,则可以使用Show
上的show
功能。否则以下行:
a
不会编译,因为Haskell不确定它可以在tell (x:[]) = "The list has one element: " ++ show x
上调用show
。但是,通过约束类型x
,我们知道我们只能在a
是tell
的实例的类型上使用a
,从而Show
函数是定义。