46

Haskell に次のカスタム データ型と関数があるとします。

data Person = Person { first_name :: String, 
                       last_name :: String,
                       age :: Int 
                     } deriving (Eq, Ord, Show)

print_agePerson の年齢を出力する関数を作成したい場合、次のように: 、 age パラメータにアクセスするprint_age (Person "John" "Smith" 21)にはどのように記述すればよいでしょうか? print_age私はオブジェクト指向の人なので、ここでは私の要素から外れています。私は基本的に Person.age に相当するものを探しています。

4

3 に答える 3

62

関数の適用は接頭辞なので、OOP 言語で一般的なものにage person相当します。person.age()関数は、print_age関数合成によって無意味に定義できます

print_age = print . age

またはポイントフル

print_age person = print (age person)
于 2012-04-11T23:58:43.907 に答える
23

これはレコード構文と呼ばれ、LYAH には適切なセクションがあります。

データ型がレコードで定義されている場合、Haskell はレコードと同じ名前の関数を自動的に定義してアクセサーとして機能します。この場合age、 は age フィールド (タイプは ) のアクセサーであり、Person -> Intと も同様です。first_namelast_name

age personこれらは通常の Haskell 関数であるため、またはのように呼ばれfirst_name personます。

于 2012-04-12T00:04:34.937 に答える
12

他の回答で言及されている機能に加えて、ageパターンマッチングを使用すると便利な場合があります。

print_age Person { age = a } = {- the a variable contains the person's age -}

命名ビットをスキップできる非常に無害な拡張機能があります。

{-# LANGUAGE NamedFieldPuns #-}
print_age Person { age } = {- the age variable contains the person's age -}

...そしてもう 1 つは、さまざまなコミュニティ メンバーによってさまざまな程度の不信感を持って表示されているため、どのフィールドをスコープに含めたいかを言うのをスキップすることさえできます。

{-# LANGUAGE RecordWildCards #-}
print_age Person { .. } = {- first_name, last_name, and age are all defined -}
于 2012-04-12T04:14:09.413 に答える