Pertanyaan Pola Haskell mencocokkan kasus simetris


Misalkan saya memiliki ekspresi haskell seperti:

foo (Nothing, Just a) = bar a
foo (Just a, Nothing) = bar a

Apakah ada sintaks haskell untuk menutup kasus-kasus itu, jadi saya bisa mencocokkan kedua pola dan menentukan bar a sebagai jawaban untuk keduanya? Atau apakah itu sesingkat yang saya bisa mendapatkannya?


8
2018-05-11 18:35


asal


Jawaban:


Itu sesingkat seperti di Haskell. Di ML ada sintaks untuk apa yang Anda inginkan (dengan menulis beberapa pola, yang mengikat variabel yang sama, di samping satu sama lain dipisahkan oleh | dengan tubuh setelah pola terakhir), tetapi di Haskell tidak ada.


5
2018-05-11 18:45



Jika kode Anda lebih kompleks daripada contoh Anda, Anda mungkin ingin melakukan sesuatu seperti ini, menggunakan Alternative contoh untuk Maybe dan PatternGuards ekstensi (bagian dari Haskell2010).

{-# LANGUAGE PatternGuards #-}
import Control.Applicative

foo (x, y) | Just a <- y <|> x = bar a

Jika Anda tidak terbiasa dengan itu, <|> memilih yang paling kiri Just jika ada satu dan kembali Nothing jika tidak, menyebabkan penjaga pola gagal.


8
2018-05-11 19:17



Kamu dapat memakai -XViewPatterns, untuk menambahkan fungsi sewenang-wenang untuk meruntuhkan dua kasus Anda menjadi satu pola. Pola Anda sekarang berfungsi p yang menghasilkan hal yang ingin Anda cocokkan:

foo (p -> (Just a, Nothing)) = bar a

jauh lebih sederhana!

Kami harus mendefinisikan p meskipun, seperti:

p (Nothing, a@(Just _)) = (a, Nothing)
p a@(Just _,   Nothing) = a
p a                     = a

atau bagaimanapun Anda ingin menormalkan data sebelum melihat.


Referensi: Itu Panduan Pengguna GHC di View Patterns


4
2018-05-11 20:13