我正在尝试学习Haskell。

我正在这里阅读代码[1]。我只是从第46和298-300行中复制并复制了一部分代码。

问题:(..)是什么意思?

我Ho了一下,但没有结果。

module Pos.Core.Types(
-- something here

 SharedSeed (..) -- what does this mean?

) where


newtype SharedSeed = SharedSeed
{ getSharedSeed :: ByteString
} deriving (Show, Eq, Ord, Generic, NFData, Typeable)

[1] https://github.com/input-output-hk/cardano-sl/blob/master/core/Pos/Core/Types.hs

最佳答案

导入/导出列表的语法与Haskell本身的语法关系不大。这只是您要从模块中导出的所有内容的逗号分隔列表。现在,这里存在一个问题,因为Haskell实际上有两种语言,它们的符号可能具有相同的名称。对于newtype来说,这尤其常见,例如您的示例:您有一个类型级别的名称SharedSeed :: *,还有一个值级别的名称(数据构造函数)SharedSeed :: ByteString -> SharedSeed

这仅在大写名称中发生,因为类型级别的小写始终是局部类型变量。因此,导出中的约定列出了大写名称是指类型。

但是仅导出类型不允许用户实际构造该类型的值。这通常是谨慎的:并非所有内部表示值都可以成为新类型的合法值(请参见Bartek's example),因此最好只导出一个安全的智能构造函数,而不是不安全的数据构造函数。

但是有时候,您确实希望使数据构造函数可用,当然对于Maybe这样的多构造函数类型而言。为此,导出列表可以使用三种语法:

module Pos.Core.Types(
  • SharedSeed (SharedSeed)将导出构造函数SharedSeed。在这种情况下,这当然是唯一的构造函数,但是如果存在其他构造函数,则不会使用此语法导出它们。
  • SharedSeed (..)将导出所有构造函数。同样,在这种情况下,这只是SharedSeed,但例如Maybe它将同时导出NothingJust
  • pattern SharedSeedShareSeed导出为独立模式(与ShareSeed类型的导出无关)。这需要 -XPatternSynonyms extension
    )
    
  • 关于haskell - 这是什么意思?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45460137/

    10-12 03:49