69958


[代数的データ型 - ウォークスルー Haskell](http://walk.northcol.org/haskell/adts/) を参考にしています。

`フィールドラベル`を使用した下記のコードでは内部のデータに簡単にアクセスできています。

引用:

>
[code]

>     data Person = Person { name :: String, age :: Int }
>  
>     taro = Person { name = "Taro", age = 25 }
>  
>     main = do print $ name taro  -- 出力: "Taro"
>               print $ age taro   -- 出力: 25
>  
[/code]

**実際に試した内容**  
上記ファイルを **Bar.hs** という名前で保存し

[code]

    % docker run -it --rm --name bar-haskell -v "$PWD":/tmp -w /tmp haskell:8 runghc Bar.hs
    
[/code]

表示された値:

[code]

    "Taro"
    25
    
[/code]

一方

>
[code]

>     data Shape = Rect Double Double
>  
>     area :: Shape -> Double
>     area(Rect x y)= x * y
>  
>     main = print $ area(Rect 2 3) -- 出力: 6.0
>  
[/code]

（なぜそのままコピペすると カッコが全角？になっていたので修正して引用してます）

の例は1つ目の Double にアクセスしている例がないように感じます（型は違うけど, `name taro` に相当する箇所）。（`x *
y`のxで取り出せているようですけど、そういうことではなく）

簡単にアクセスして取り出す方法はないんでしょうか？


CC BY-SA 4.0
2020-08-29T02:04:14.400
69956
2020-08-29T03:33:06.527
2020-08-29T02:10:20.707
9008
9008
question
haskell
データ型の1番目の要素にアクセスするにはどうすればいいんでしょうか？


`Rect` 型について言えばないです。パターンマッチして取り出す方法しかありません。

通例、レコード型でない値コンストラクターから、パターンマッチで特定の要素にのみアクセスしたい、という場合は次のように書きます。

[code]

    getX :: Shape -> Double
    getX (Rect x _) = x
    
[/code]

二つ目の変数名をアンダースコアのみにしているのは、「この変数は使いませんよ」というのを明示するためです。

[code]

    getX :: Shape -> Double
    getX (Rect x y) = x
    
[/code]

と書いた場合、「`y`を使ってないけど大丈夫？」とGHCが警告してくれます。

なお、`getX`のような関数を自分で定義しないで簡単にアクセスできるようにするためには `Person` 型のようにレコード型にする、というが原則です。


CC BY-SA 4.0
2020-08-29T03:12:27.310
69958
2020-08-29T03:33:06.527
2020-08-29T03:33:06.527
8007
8007
69956
answer