5256


以下のようにレコード構文(Record Syntax)にて独自の名前付きフィールド(Named
Fields)らを定義し、フィールド(Field)の一部を利用する場合に、より簡潔な方法はありませんでしょうか？

下記のコードでいえば `fNumField Foo{hoge = x} = x ^ 2` の部分が粗雑に感じます。

[code]

    data Foo = Foo{ bar :: String , hoge::Integer} deriving (Show)
    
    main = do
        print $ fNumField a
        where
            fNumField Foo{hoge = x} = x ^ 2
            a = Foo{ bar = "piyo", hoge = 575 }
    
[/code]

※ (別の質問の方がいいのかもしれませんが) F# や OCamlのような言語と違い「名前付きフィールド」が Haskell
には似合わないような気がしています。通常はどうかくものなのでしょうか？

※ 「命名規則や用語がHaskell的に変だ！」という場合もぜひ、コメントや編集などでフィードバックお願いします！

# 追記 : 2015-01-26

回答を参考に修正してみました。

[code]

    data Foo = Foo{ bar :: String , hoge::Integer} deriving (Show)
    
    main = print $ hoge a ^ 2
        where
            a = Foo{ bar = "piyo", hoge = 575 }
    
[/code]

※ hoge の定義がかぶった場合はコンパイル時に Multiple declarations などと怒られてしまったので、使いどころが難しく感じました。


CC BY-SA 3.0
2015-01-25T12:48:41.200
5254
2015-01-26T02:08:01.683
2015-01-26T00:05:28.793
5021
5021
question
haskell
Haskell の レコード構文(Record Syntax) にて、より簡潔にフィールド(field)にアクセスする方法はありませんでしょうか。


Record syntax を使った時には同名の関数が作られます．また， Record syntax
を使ってデータ型を定義してもそうでない記法で値を作ることができます．

そのまま書くならこういう感じでしょうか

[code]

    data Foo = Foo { bar :: String, hoge :: Integer} deriving (Show)
    -- hoge :: Foo -> Integer が定義される
    
    main = print $ fNumField a
        where
            fNumField = (^2) . hoge
            a = Foo "piyo" 575
    
[/code]


CC BY-SA 3.0
2015-01-25T13:19:02.703
5256
2015-01-25T13:19:02.703
2901
5254
answer