Haskell中的"the"是什么,它如何使用?

4
在 Haskell 中,有几个关于 the 的类型定义让我无法理解它们的共同目的是什么?如果有的话,它们是什么?例如来自 Hoggle:
the :: Eq a => [a] -> a

the :: HasAny sel s t a b => Lens s t a b

the :: (Eq a, Monad m) => SerialT m a -> m (Maybe a)

etc.


3
在 Haskell 中,就像几乎所有的语言一样,模块实际上是命名空间,因此库的创建者无需担心名称与其他库(或尚未编写的库)中的名称冲突。我们基本上有三个独立的函数,对于这些函数,库作者(在每种情况下可能不同)决定使用“the”作为适当的名称,除了名称之外,它们很可能没有任何共同之处。如果您看到使用其中一个函数的代码,则导入语句应该清楚地表明所使用的函数。 (这似乎是一个奇怪的问题要在SO上问,我很惊讶人们竟然回答并得到了赞!) - Robin Zigmond
2
@RobinZigmond 不管怎样,我很高兴自己问了,而不是让自己疑惑不解。感谢你的回答。 - allor99
2个回答

8

the这个函数确保列表中的所有元素都相等(因此Eq),否则会发生panic。它的名称是这样取的,因为它可以在列表中仅通过相等性给出“唯一”的元素。

>>> the [1, 2, 3]
Error
>>> the [1, 1, 1]
1

第二个 the 用于构造镜头(可以“提取”数据的部分)。例如,您可以使用 the @"name" 来制作一个将记录类型的 name 字段提取出来的镜头。或者使用 the @Int 提取数据中唯一的 Int 值,或者使用 the @3 获取数据的第三个组件。

data Human = Human
  { name    :: String
  , age     :: Int
  , address :: String
  }
  deriving (Generic, Show)
human :: Human
human = Human "Tunyasz" 50 "London"

>>> human ^. the @Int
50
>>> human ^. the @"name"
"Tunyasz"
>>> human ^. the @3
"London"

第三个函数与第一个函数类似,但是它适用于库中的流streamly而不是列表,并且在元素不相同时返回None而不是恐慌。

2
那么这些函数之间就没有关系,只是恰好在不同的扩展命名空间中定义了相同的名称,正如@RobinZigmond所指出的那样? - allor99

5
你所提到的不同定义来自不同包中的不同模块:第一个来自于 base 中的 GHC.Exts,第三个来自于 streamly,在这两者中它用于确保列表只包含一个值,并返回该值;第二个来自于 generic-lens 中的 Data.Generics.Product.Any,在其中它用于从 Lens 中选择某些内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接