do {...}中的Haskell Last生成器必须是表达式错误类型绑定错误

时间:2012-02-06 08:03:48

标签: haskell

我正在从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  

1 个答案:

答案 0 :(得分:3)

几点:

  • 整个过程中都有奇怪的缩进事项。确保您使用的是空格而不是标签。

  • subsearch中,您经常有cnic <- getLine(当您可能需要getInt时),但之后不会在递归调用中使用它。

  • if语句中,您应该x == 1等,而不是x = 1。还要考虑使用case语句或guards而不是嵌套if-then-else。

  • 您在x == 3案例中遗漏了“do”。

  • getIntreadLn相同。

  • 您的searchByFirstName功能可以写得更好。

  • Database由三个String字段组成,但searchByFirstName中的错误案例会返回(String, String, Int)类型的值。