Pertanyaan "Tidak dapat menemukan pola" saat menggunakan jenis serikat bertanda


saya punya aplikasi yang mencakup banyak modul. Pada awalnya, saya memodelkan masalah saya, membuat beberapa tipe data. Pada bagian kedua, saya menempatkan pandangan.

Salah satu jenis itu adalah jenis serikat bertanda:

type alias Letter = Char
type GuessedLetter = Guessed Letter | Unguessed

Dalam modul Tampilan saya, saya memiliki fungsi untuk menampilkan surat:

guessToChar : GuessedLetter -> Char
guessToChar guess =
  case guess of
    Guessed l -> l
    Unguessed -> '_'

Tetapi ketika saya mencoba mengkompilasi file-file ini, saya mendapatkan error berikut:

## 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.

Saya pikir "Mungkin saya harus mengekspor tag serta jenisnya?", Tetapi tidak juga menambahkan tag ke ekspor modul maupun mencoba untuk sepenuhnya memenuhi syarat tag (GuessedLetter.Guessed) telah menyelesaikan masalah ini.

Bagaimana cara memperbaiki fungsi ini?


5
2017-07-23 01:48


asal


Jawaban:


Seperti yang saya duga, jika Anda ingin menggunakan tag di luar modul, Anda harus mengekspornya juga. (Saya hanya tidak yakin bagaimana).

Untuk melakukan itu, tambahkan tag dalam daftar yang dipisahkan koma di dalam tanda kurung.

Dari kode sumber untuk Maybe (tipe yang 'berhasil' seperti yang saya inginkan milik saya):

module Maybe exposing
  ( Maybe(Just,Nothing)
  , andThen
  , map, map2, map3, map4, map5
  , withDefault
  , oneOf
  )

Atau dalam kasus saya:

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

Di sisi pengimporan, Anda dapat memilih untuk sepenuhnya memenuhi syarat tag (dengan modul, bukan mengetik):

import Game exposing GuessedLetter
{- ... -}

guessToChar : GuessedLetter -> Char
guessToChar guess =
  case guess of
    Game.Guessed l -> l
    Game.Unguessed -> '_'

atau mengekspos tag juga:

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

guessToChar : GuessedLetter -> Char
guessToChar guess =
  case guess of
    Guessed l -> l
    Unguessed -> '_'

12
2017-07-23 02:31