我正在尝试学习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
它将同时导出Nothing
和Just
。 pattern SharedSeed
将ShareSeed
导出为独立模式(与ShareSeed
类型的导出无关)。这需要 -XPatternSynonyms
extension。)
关于haskell - 这是什么意思?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45460137/