2012-02-06 11 views
0

ハスケルから小さなシステムを実行していて、 という2つのエラーが発生しました。 "do {...}の最後のジェネレータは式 "と " 明示的 ターム結合型付けで型エラー:(FNAME、LNAME、CNIC) タイプ:(a、b、c)は、 が一致しません:データベースHaskell do {...}の最後のジェネレータは式エラー型のバインディングエラーでなければなりません

plzはそれほどの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 
+0

エラーメッセージが参照する行を必ず教えてください。 – dave4420

+0

@ dave4420 20行目と13行目 – Zeus

+0

これはどの行ですか?このウェブサイトのコードリストには自動的に番号が付けられません。通常、エラーがどこにあるかを示すためにコードサンプルにコメントを追加するのが最善です。 – dave4420

答えて

3

いくつかのポイント:

  • が全体に奇妙なインデントのものがあります。スペースではなくタブを使用していることを確認してください。

  • subsearchの場合は、cnic <- getLine(おそらくgetIntが必要な場合)がよくありますが、再帰呼び出しでは使用しないことがよくあります。

  • ifの文では、ではなくx == 1などが必要です。 if-then-elseをネストするのではなく、caseステートメントまたはガードを使用することも検討してください。

  • お客様のx == 3ケースに「do」がありません。

  • readLnと同じです。

  • あなたのsearchByFirstName機能をより良く書くことができます。

  • Databaseは3つのString分野で作られたが、searchByFirstNameであなたのエラーの場合は、タイプ(String, String, Int)の値を返します。

+0

コメントありがとうございました... – Zeus

関連する問題