使用标记的联合类型时"无法找到模式"

and*_*ich 5 elm

有一个跨多个模块的应用程序.首先,我模拟我的问题,创建几种数据类型.在第二个,我正在提出意见.

其中一种类型是标记的联合类型:

type alias Letter = Char
type GuessedLetter = Guessed Letter | Unguessed
Run Code Online (Sandbox Code Playgroud)

在我的View模块中,我有一个显示字母的功能:

guessToChar : GuessedLetter -> Char
guessToChar guess =
  case guess of
    Guessed l -> l
    Unguessed -> '_'
Run Code Online (Sandbox Code Playgroud)

但是当我尝试编译这些文件时,我收到以下错误:

## ERRORS in src/Views.elm #####################################################

-- NAMING ERROR -------------------------------------------------- src/Views.elm

Cannot find pattern `Guessed`

21|       Guessed l -> l
          ^^^^^^^^^

-- NAMING ERROR -------------------------------------------------- src/Views.elm

Cannot find pattern `Unguessed`

22|       Unguessed -> '_'
          ^^^^^^^^^

Detected errors in 1 module.
Run Code Online (Sandbox Code Playgroud)

我想"也许我应该导出标签以及类型?",但是既没有将标签添加到模块导出也没有尝试完全限定标签(GuessedLetter.Guessed)已经解决了问题.

我该如何修复这个功能?

and*_*ich 13

我怀疑,如果你想在模块外部使用标签,你也必须将它们导出.(我只是不确定如何).

为此,请在括号内的逗号分隔列表中添加标记.

源代码Maybe(以我希望的方式'工作'的类型):

module Maybe exposing
  ( Maybe(Just,Nothing)
  , andThen
  , map, map2, map3, map4, map5
  , withDefault
  , oneOf
  )
Run Code Online (Sandbox Code Playgroud)

或者在我的情况下:

module Game exposing (Letter, GuessedLetter(Guessed, Unguessed))

在导入方面,您可以选择完全限定标签(使用模块,而不是类型):

import Game exposing GuessedLetter
{- ... -}

guessToChar : GuessedLetter -> Char
guessToChar guess =
  case guess of
    Game.Guessed l -> l
    Game.Unguessed -> '_'
Run Code Online (Sandbox Code Playgroud)

或者公开标签:

import Game exposing GuessedLetter(Guessed, Unguessed)
{- ... -}

guessToChar : GuessedLetter -> Char
guessToChar guess =
  case guess of
    Guessed l -> l
    Unguessed -> '_'
Run Code Online (Sandbox Code Playgroud)