2017-09-05 21 views
4

私は、次のnewtypes宣言:私はいくつかの例で作成にアクセスする方法のnewtypeという名前のタプルフィールド

*Main Lib> :t Code 
Code :: String -> Code 
*Main Lib> :t Name 
Name :: String -> Name 
*Main Lib> :t Account 
Account :: (Code, Name) -> Account 

、その後::だから

newtype Code = Code String deriving (Show) 
newtype Name = Name String deriving (Show) 
newtype Account = Account (Code, Name) deriving (Show) 

を今すぐ

cn = Code "1.1.1" 
nn = Name "Land And Buildings" 
an = Account (cn, nn) 

*Main Lib> an 
Account (Code "1.1.1",Name "Land And Buildings") 

をI anCodeフィールドにアクセスする必要があります。これは0123のようなものですどうすればいいですか?

はそれではなくnewtypeDataを使用することをお勧めしますか? Haskellでタプルという名前の新しい型を作成できるようになったら、内部の要素に簡単にアクセスできるはずです。

+1

'data account = Account {accCode :: Code、accName :: Name}'そして 'accCode an'(NB: '名前付きタプル'はレコードです) – user2407038

答えて

8

それはnewtypeの代わりにdataを使用することをお勧めしますか?

あの、はい... newtypeの全体のポイントは、シングルタイプに新しい名前を与えることです。コンポジット型の構築には使用されていません。 user2407038が提案のようなので、それ

data Account = Account 
    { accCode :: Code 
    , accName :: Name 
    } deriving (Show) 

行い、その後、あなたは、単にそれはあなたが与える提供、またのnewtypeに埋もれタプルのアクセスフィールドに難しいことではありません、と述べた

*Main Lib> let an = Account (Code "1.1.1") (Name "Land And Buildings") 
*Main Lib> accCode an 
Code "1.1.1" 

を使用することができますunwrapperをニュータイプ:その後、

newtype Account = Account {getAccount :: (Code, Name)} 
    deriving (Show) 

*Main Lib> let an = Account (Code "1.1.1", Name "Land And Buildings") 
*Main Lib> fst $ getAccount an 
Code "1.1.1" 

あなたは空想になりたい場合は、あなたも「20.2nd世紀レコードアクセサ」を使用することができ、lenses:その後、

{-# LANGUAGE TemplateHaskell, FunctionalDependencies #-} 
import Lens.Micro 
import Lens.Micro.TH 

data Account = Account 
    { accountCode :: Code 
    , accountName :: Name 
    } deriving (Show) 
makeFields ''Account 

*Main Lib> let an = Account (Code "1.1.1") (Name "Land And Buildings") 
*Main Lib> an^.code 
Code "1.1.1" 
4

あなたは、パターンマッチングを使用することができます。例えば。

case an of 
    Account (Code c, Name n) -> "Code " ++ C++ ", Name " ++ n 

や、関数定義では、あなたは直接、通常は優れているdataを使用して

foo :: Account -> String 
foo (Account (Code c, Name n)) = "Code " ++ C++ ", Name " ++ n 

を書くことができます。

data Account = Account Code Name 
-- ... 
case an of 
    Account (Code c) (Name n) -> "Code " ++ C++ ", Name " ++ n 
関連する問題