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 `|')
我想对此有所帮助.感谢名单.
除了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从帐户中获取金额.
回想一下,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.