4

私は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の場合は100になります。

私が書いた関数はこれでした

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

2行目は、imがスタックしている場所で、エラーメッセージが表示されます。

入力の構文エラー(予期しない `|')

これについて助けが欲しいのですが。ありがとう。

4

2 に答える 2

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を参照してください。

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

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

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

于 2011-07-04T07:12:57.927 に答える
6

Haskellタイプの名前は大文字で始まるので、タイプcheckBalance

checkBalance :: AcInfo -> AcNo -> Amnt

あなたの質問では、リスト内包表記の使用を目指しているようですが、構文が正しくありません。

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

アカウントがにある場合、この定義は問題ありませんdbase

*メイン>checkBalancebankAccounts "oo1"
100

しかし、そうでないときは爆破します。

*メイン>checkBalancebankAccounts "001"
***例外:Prelude.head:空のリスト

より良いタイプcheckBalance

checkBalance :: AcInfo -> AcNo -> Maybe Amnt

一般的なケースを表すために、つまりdbaseが含まれる場合と含まれない場合がありますnumber

于 2011-07-04T03:10:38.783 に答える