我正在从Haskell做一个小系统,我得到了两个错误 “ do {...}中的最后一个生成器必须是表达式”和 “显式类型绑定中的类型错误 期限:(fname,lname,cnic) 类型:(a,b,c) 不匹配:数据库“
我是haskell的新手,所以PLZ帮助我。
-------Data types-------
type FirstName = String
type LastName = String
type CustomerNIC = String
type Database = ( FirstName , LastName , CustomerNIC )
--type Details = [Database]
------Data base---------
exampleBase :: [Database]
exampleBase = [ ( "Kevin" , "Desilva" , "8929323V" ),( "Nimal" , "Perera" , "89120323V" ) ]
-------Main Menu-----------------------------
getInt :: IO Int
getInt = do line <- getline
return (read line :: Int)
selectsearch ::IO()
selectsearch = do
putStr"\n\n\t 1.Search by NIC:"
putStr"\n\n\t 2.Search by First Name:"
putStr"\n\n\t Your Chocie:"
input<-getInt
subsearch input
subsearch :: Int->IO()
subsearch x = do
if(x=1) then do
putStr"\n\t Enter NIC:"
cnic <- getLine
subsearch
else if (x=2) then do
putStr"\n\t Enter First Name:"
cnic <- getLine
subsearch
else if (x=3) then putStr "\n ERROR"
selectsearch
else MainMenu
------- Search ------------
getfName :: Database -> FirstName
getfName ( fname , lname , cnic ) = fname
searchByFirstName :: Database -> FirstName -> Database
searchByFirstName (a:ax) fname
| fname == getfName a = a
| length ax == 0 && getfName a/= fname = ("No Data","",0)
| otherwise = searchByFirstName ax fname
答案 0 :(得分:3)
几点:
整个过程中都有奇怪的缩进事项。确保您使用的是空格而不是标签。
在subsearch
中,您经常有cnic <- getLine
(当您可能需要getInt
时),但之后不会在递归调用中使用它。
在if
语句中,您应该x == 1
等,而不是x = 1
。还要考虑使用case语句或guards而不是嵌套if-then-else。
您在x == 3
案例中遗漏了“do”。
getInt
与readLn
相同。
您的searchByFirstName
功能可以写得更好。
Database
由三个String
字段组成,但searchByFirstName
中的错误案例会返回(String, String, Int)
类型的值。