2016-03-30 15 views
0

さて、1週間前ではなく、オブジェクト指向プログラミングから来た人として、ハスケルは幾分圧倒的です - これは答えられている可能性がありますが、私の研究はすべて果実無し。私と一緒に抱きしめてください。Haskell - 代数的データ型から値を抽出する実装関数

getHouseNumber :: Person -> Integer 
getHouseNumber (Person _ houseNumber _) = houseNumber 

getBorrower :: Book -> Person 
getBorrower (Book borrower _) = borrower 

私の質問:私はあなたは、単に機能を持つ単一の代数的データ型から値を抽出することができます知っている今

は、私は2つの代数的データ型を持っていると言います私は答えを得ると頭の中で自分を叩くつもりだと誓っています。bookから直接houseNumber(例として)を抽出する関数を書くにはどうすればいいですか?言い換えれば、

getHouseNumberFromBook :: Book -> Integer 

ありがとうございます。

答えて

3

まず、これは既にが同様の投影として自動的定義されるhouseNumberので冗長

getHouseNumber :: Person -> Integer 
getHouseNumber (Person _ houseNumber _) = houseNumber 

あります。これは、data宣言の記録記法を使用することから得られます。つまり、Haskellは既に自動的に定義しています

houseNumber :: Person -> Integer 
houseNumber (Person _ hN _) = hN 

これを複製する必要はありません。 borrowerおよび他のフィールドについても同様です。実際の質問について

、我々は単にアクセサを構成することができます。これはなくても、人はおそらく、直接その定義を使用できるように短いです

getHouseNumberFromBook :: Book -> Integer 
getHouseNumberFromBook = houseNumber . borrower 

getHouseNumberFromBook :: Book -> Integer 
getHouseNumberFromBook b = houseNumber (borrower b) 

または、より慣用的には、カスタム関数を定義します。

+0

が表示されます。どうもありがとうございました。 –

1

レコードのフィールドは、実際にはADTから値を抽出する関数です。したがって、あなたはborrower :: Book -> PersonhouseNumber :: Person -> Integerです。したがって、合成演算子.を使用して、新しい関数houseNumber . borrower :: Book -> Integerを作成することができます。

関連する問題