69969


[Haskell 代数的データ型 超入門 -
Qiita](https://qiita.com/7shi/items/1ce76bde464b4a55c143) で
Haskellのデータ型はEnumのようであるというような記述を見かけました。サンプルに載っている

> data Color = Blue | Red | Green | White

は Swiftで書くと

[code]

    enum Color {
        case blue
        case red
        case green
        case white
    }
    
[/code]

こんな感じでしょう。

さて Swift では [付属型enum(Associated
Value)](https://qiita.com/hachinobu/items/392c96820588d1c03b0c#%E4%BB%98%E5%B1%9E%E5%9E%8Benumassociated-
value) が使えますから、Enumのパワーが強力です。おそらくHaskellにだいぶ近いんじゃないでしょうか？

上記リンクにある

>
[code]

>     enum Barcode {
>         case upca(Int, Int, Int, Int)
>         case qrcode(String)
>     }
>  
[/code]

を使って下記のようなSwiftコードを書いてみました

[code]

    import Foundation
    enum Barcode {
        case upca(Int, Int, Int, Int)
        case qrcode(String)
    }
    func getBarcodeString(barcode: Barcode) -> String {
        switch barcode {
        case .upca(let a, let b, let c, let d):
            return String(a) + String(b) + String(c) + String(d)
        case .qrcode(let s):
            return s
        }
    }
    let barcode1 = Barcode.upca(1, 2, 3, 4)
    let barcode2 = Barcode.qrcode("A")
    print(getBarcodeString(barcode: barcode1))
    print(getBarcodeString(barcode: barcode2))
    
[/code]

出力結果は

[code]

    1234
    A
    
[/code]

です。

これと同じことをHaskellでやってみようと思ったのですが、関数を書くのに慣れておらずうまく書けません。型と変数だけはうまく作れたので下記に載せます。

[code]

    data Barcode = Upca Int Int Int Int
                 | Qrcode String
                 
    barcode1 = Upca 1 2 3 4
    barcode2 = Qrcode "A"
    
[/code]

`getBarcodeString` は Haskellだとどう書けばいいんでしょうか？

おそらく Swift の `case .upca(let a, let b, let c, let d):`
みたいな取り出し方はHaskellになくて、[こちらで質問した](https://ja.stackoverflow.com/questions/69956/%e3%83%87%e3%83%bc%e3%82%bf%e5%9e%8b%e3%81%ae1%e7%95%aa%e7%9b%ae%e3%81%ae%e8%a6%81%e7%b4%a0%e3%81%ab%e3%82%a2%e3%82%af%e3%82%bb%e3%82%b9%e3%81%99%e3%82%8b%e3%81%ab%e3%81%af%e3%81%a9%e3%81%86%e3%81%99%e3%82%8c%e3%81%b0%e3%81%84%e3%81%84%e3%82%93%e3%81%a7%e3%81%97%e3%82%87%e3%81%86%e3%81%8b)
ときのサンプルに載っている全件取り出しみたいな関数を別途作らないといけないのかな？（とはいえそれらのパーツをうまくつないで1つの関数を作る方法がわかっていません）


CC BY-SA 4.0
2020-08-29T09:33:33.470
69968
2020-08-29T11:06:00.103
2020-08-29T09:56:05.150
9008
9008
question
swift haskell
Swiftの付属型enumからデータを取り出すようなコードをHaskellで書きたい


引数部分にパターンを使えるので次のように書けます。

[code]

    getBarcodeString :: Barcode -> String
    getBarcodeString (Upca a b c d) = show a ++ show b ++ show c ++ show d
    getBarcodeString (Qrcode s    ) = s
    
    main = do
        putStrLn $ getBarcodeString barcode1
        putStrLn $ getBarcodeString barcode2
    
[/code]

より素朴に`case`式を使うのであれば

[code]

    getBarcodeString' :: Barcode -> String
    getBarcodeString' x = case x of
        Upca a b c d -> show a ++ show b ++ show c ++ show d
        Qrcode s     -> s
    
[/code]

となります。


CC BY-SA 4.0
2020-08-29T11:00:16.193
69969
2020-08-29T11:06:00.103
2020-08-29T11:06:00.103
13199
13199
69968
answer