【问题标题】:Haskell Last generator in do {...} must be an expression error typed binding errorHaskell Last generator in do {...} 必须是表达式错误类型绑定错误
【发布时间】:2012-02-06 08:03:47
【问题描述】:

我正在用 Haskell 做一个小系统,但我遇到了两个错误 “do {...} 中的最后一个生成器必须是表达式”和 "显式类型绑定中的类型错误 术语 : (fname,lname,cnic) 类型:(a,b,c) 不匹配:数据库"

我是 haskell 的新手,所以请帮帮我。

-------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  

【问题讨论】:

  • 总是告诉我们错误消息指的是哪些行。
  • 那是哪几行?本网站上的代码列表不会自动编号。通常最好在代码示例中添加 cmets 以指示错误所在。

标签: haskell


【解决方案1】:

几点:

  • 到处都有奇怪的缩进。确保您使用的是空格而不是制表符。

  • subsearch 中,您通常有cnic &lt;- getLine(当您可能需要getInt 时),但随后不在递归调用中使用它。

  • 在您的if 语句中,您应该有x == 1 等,而不是x = 1。还可以考虑使用 case 语句或守卫,而不是嵌套 if-then-else。

  • 您在x == 3 案例中缺少“做”。

  • getIntreadLn 相同。

  • 你的searchByFirstName函数可以写得更好。

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

【讨论】:

  • 感谢您的评论...它在一定程度上帮助了我
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-31
  • 2017-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多