1

C++ と Haskell による卒業研究のケーススタディとして、レコードの配列のインデックスのバイナリ検索を選択しました。

  import Data.List

  data BookInfo = Book Int String [String]
            deriving (Show)

--変数の入力

  entering :: Int String [String]-> Book
  entering id name subject= Book id name subject

-- タプルの配列の idex を作成します

  index :: [Book]->[Int]
  index [m] = getID (Book id _     _      ) = id
  main :: IO ()
  main = do
  putStrLn "Please enter your book id,name,Subject"
  Book inpStr <- getLine
  putStrLn print r

-- マップを使用した BubbleSort

 bubbleSort ::(Ord x) => [x] -> [x]
 bubbleSort (x':xs) = if x>x' then x': bubbleSort(x:xs)
                  else
                  if x<x' then x: bubbleSort(x':xs)
                  else 
                               x: bubbleSort(X':xs)

 bubble ::[a] -> [a]
 bubble [a] = map bubbleSort [a]

-- 配列のインデックスを作成

 indexsort(ord a)::[int]->[Int]
 indexsort a=bubble a

--タプルのリストを作る

 addBooks2List Book->[Book]->[Book]
 addBooks2List b m=b:entering b':m

--バイナリサーチ

 binarysearch [Int]->Int->Int->Int->Int
 a=bubble x
 binaryseach a i m j=
 let u=(i+m)/2
 if a[u]=j then u
 if a[u]>j then binaryseach a i u-1 j
 else 
 if a[u]<j then binarysearch a u+1 m j
 if i=m "Not found"

-- 検索された ID を持つタプルを出力します

 print::Int->Book
 print r= Book r y z 
 r=binaryseach m 0 (length m)

入力 'entering' で 8:3 解析エラーでエラーが発生しました。このエラーの意味は何ですか? どうすれば修正できますか?

4

2 に答える 2

3

コードには非常に多くの問題があります。単一の関数から始めて、プログラムをゆっくりと成長させ、インクリメンタルな部分がコンパイルされることを確認するのが最善です。これから始めて:

entering :: Int String [String]-> Book
entering id name subject= Book id name subject

まず、Bookは型ではなくデータコンストラクタであり、型はBookInfoです。次に、(dblhelixが指摘したように)矢印がありません。したがって、次のようになります。

entering :: Int -> String -> [String]-> BookInfo
entering id name subject= Book id name subject

これはコンパイルされます。ただし、entering今はと同じBookです。とにかく、次の関数を追加してコンパイルするなどの作業を続けます。

続ければ、

index :: [Book]->[Int]
index [m] =

定義が欠落しており(?の右側にあるもの=)、[m]おそらく必要なものではない単一の要素を持つリストにのみ一致します。この機能を完了するか、コメントアウトして残りを続行します。どうやらあなたは現在それをまったく使用していません。等々。

于 2012-07-16T07:50:18.393 に答える
3

1 つには、型シグネチャは次のようにentering読む必要があります。

entering :: Int -> String -> [String] -> BookInfo

ではなくentering :: Int String [String]-> Book— しかし、これは型エラーであり、解析エラーではありません。

インデントが間違っている可能性がありますが、コードを逐語的に入手できなければ、それを判断するのは困難です。覚えておいてください: Haskell では、C や Java などの言語とは対照的に、コードのレイアウトが重要です。

とにかく、あなたが投稿したコードは、問題の実用的な解決策とはほど遠いものです。少し戻って、Haskell で初等関数を作成する方法を学び、その後、より複雑なプログラムを作成するためにそれらを結合する方法を学習することをお勧めします。C++ のスニペットを Haskell に変換しようとして言語を学習することに、成功する可能性が高いかどうかは本当に疑問です。ほんの2セントですが...

于 2012-07-16T07:26:34.487 に答える