2011-07-04 15 views
4

私はHaskellを新しくしており、この状況について助けが必要です。私は私の要件は、口座番号に相当する量を得ることです以下のリスト2つ以上の要素を持つタプルのリストから要素を取得します。(Haskell)

-- create a type for bank account 
type AcNo = String 
type Name = String 
type City = String 
type Amnt = Int 

type AcInfo = [(AcNo, Name, City, Amnt)] 

-- function to get the data of bank accounts to a list of tuples 
bankAccounts :: AcInfo 
bankAccounts = [("oo1", "Sahan", "Colomb", 100),("002", "John", "Jafna", 200)] 

を持って、例えば、001のためにそれは私が書いた関数は、この

--Function to check the balance of a person 
checkBalance :: bankAccounts -> AcNo -> Amnt 
checkBalance dbase number = Amnt|(AcNo, Name, City, Amnt) <- dbase, AcNo==number} 
た100

を与える必要があります

2番目の行は、エラーメッセージが表示される場所です。

Syntax error in input (unexpected `|')

私はこれについていくつかの助けをしたいと思います。 〜 Haskellの種類の名前は大文字で始まり、そのcheckBalanceの種類は、あなたの質問に

checkBalance :: AcInfo -> AcNo -> Amnt 

でなければなりません

答えて

6

リコールは、リストの内包表記を使用してを目指しているようだが、あなたはありませんかなり正しい構文です。アカウントがdbase

*Main> checkBalance bankAccounts "oo1" 
100

であるが、それがないときに吹く場合

checkBalance dbase number = head [amnt | (acNo, name, city, amnt) <- dbase, 
             acNo == number] 

この定義は罰金です。

*Main> checkBalance bankAccounts "001" 
*** Exception: Prelude.head: empty list

checkBalanceのためのより良いタイプは

checkBalance :: AcInfo -> AcNo -> Maybe Amnt 

は一般的なケースを表すことである、すなわちdbaseは又はnumberを含んでも含まなくてもよいです。

+0

ご協力いただきありがとうございます。現時点では、私はdbaseにあるアカウントに集中しています。私はあなたが言及したタイプで実験しています。再度、感謝します。 –

7

グレッグの優れた答えに加えて、論理ユニットを構成するより大きな値セットにタプルを使用しないでください。私はAccountタイプを持つことを提案します。要素にアクセスするか、アカウントの変更は、より便利に作るようなものを作るレコード構文を使用して:

data Account = Account { acNo :: AcNo 
         , name :: Name 
         , city :: City 
         , amount :: Amnt 
         } deriving (Eq, Show) 

詳細はhttp://learnyouahaskell.com/making-our-own-types-and-typeclasses#record-syntaxを参照してください。

AcInfoではなく、Accountで関数を記述し、通常のリスト関数を使用する必要があります。多くの場合、レコードが提供する抽出機能は、あなたの例のように、十分に良いです:

checkBalance :: [Account] -> AcNo -> Maybe Amnt 
checkBalance dbase number = fmap amount $ find (\acc -> number == acNo acc) dbase 
ここ

acNo accは、口座番号を取得し、amount accが口座から金額を取得します。

関連する問題