【问题标题】:What exactly does => do in haskell? [duplicate]=> 在haskell中究竟做了什么? [复制]
【发布时间】:2016-01-12 15:01:25
【问题描述】:

我刚刚开始阅读《Learn You a Haskell for Great Good》。在第 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  

谢谢。

【问题讨论】:

  • 由于某种原因,即使我使用了类似的措辞,我也找不到该链接。
  • @DxAlpha:别担心。您的问题仍在增加价值,因为下一个寻找 => 的人可能会找到它。重复不一定是坏事。

标签: haskell


【解决方案1】:

简而言之

虽然不完整,但如果您还没有阅读有关classes 的内容,您可以将其视为在a 类型上定义了一组函数的约束。

解释

您可以将其视为对类型施加约束。比如lucky的情况:

lucky :: (Integral a) => a -> String

这意味着函数是为任何类型的a定义的,只要aIntegralinstance。。

现在我不知道你是否熟悉classes(那些不是面向对象编程中使用的),但是类或多或少地在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

这意味着如果aShow 的一个实例,那么您可以在a 上使用show 函数。否则为以下行:

tell (x:[]) = "The list has one element: " ++ show x

无法编译,因为 Haskell 不确定它是否可以在 x 上调用 show。但是,通过约束a 类型,我们知道我们只能在aShow 实例的类型上使用tell,因此定义了show 函数。

【讨论】:

  • 是的,我想我还没上过课。我通常只是通过标准的 OOP 定义看到它,但如果不是基于 OOP,我希望他们使用不同的名称。
  • @DxAlpha:然后将其视为一个约束,以便您可以使用在a 上定义的一组函数。这不是“完整”规范,但现在可能就足够了。
【解决方案2】:

它将参数a 约束到某个类,在本例中为IntegralShow

【讨论】:

    猜你喜欢
    • 2019-03-06
    • 1970-01-01
    • 2018-03-23
    • 2019-02-15
    • 2015-09-15
    • 2011-06-18
    • 2012-07-23
    • 2016-09-10
    • 2023-03-15
    相关资源
    最近更新 更多