从具有2个以上元素的元组列表中检索元素(Haskell)

Tha*_*age 4 haskell tuples list-comprehension list nested-lists

我是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)]
Run Code Online (Sandbox Code Playgroud)

我的要求是获得与帐号相对应的金额,例如,对于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}
Run Code Online (Sandbox Code Playgroud)

第二行是我卡在哪里给出错误信息

Syntax error in input (unexpected `|')

我想对此有所帮助.感谢名单.

Lan*_*dei 7

除了Greg的优秀答案之外,我想指出的是,你不应该将元组用于构成逻辑单元的更大的值集.我建议有一个Account类型,例如使用记录语法,这使得访问元素或使帐户更改更方便:

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

有关详细信息,请参见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
Run Code Online (Sandbox Code Playgroud)

这里acNo acc获取帐号并amount acc从帐户中获取金额.


Gre*_*con 6

回想一下,Haskell类型的名称以大写字母开头,因此checkBalance应该是类型

checkBalance :: AcInfo -> AcNo -> Amnt
Run Code Online (Sandbox Code Playgroud)

在你的问题中,你似乎的目标是使用列表理解,但你没有正确的语法.

checkBalance dbase number = head [amnt | (acNo, name, city, amnt) <- dbase,
                                         acNo == number]
Run Code Online (Sandbox Code Playgroud)

如果有帐户,这个定义很好 dbase

*Main> checkBalance bankAccounts "oo1"
100

但是当它没有时会爆炸.

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

更好的类型checkBalance

checkBalance :: AcInfo -> AcNo -> Maybe Amnt
Run Code Online (Sandbox Code Playgroud)

来表示一般情况下,,dbase可以或可以不包含number.