0

(String、Int)ペアのリストを定義しました。

 type PatientList = [(String,Int)]

このリストに「name」および「number」の形式でデータを追加する必要があります。ここで、numberはリストに追加するたびに増加します。たとえば、3つの名前を追加した後のリスト(またはタプル)は次のようになります。

 [("bob", 1), ("ted", 2), ("harry", 3)] 

名前は、次のコードを使用して取得されます。

  do putStr "You are? "
  name <- getLine

私の現在の解決策は、名前のリスト(bob、ted、harry)を作成し、zipを使用して、これらのリストを次のように組み合わせる方法です。

 zip = [1...]["bob","ted","harry"]

このソリューションは、異なる時間にリストに追加し、一緒に結合したくないため、私の要件を満たしていません。これどうやってするの?

4

3 に答える 3

5

リストを逆順にした方がいいのではないですか?

[("harry", 3), ("ted", 2), ("bob", 1)]

追加よりも一定の時間になります:

add :: PatientList -> String -> PatientList
add [] newName = [newName]
add ((oldName, x):xs) newName = (newName, x+1):(oldName, x):xs

順番にリスト全体が必要な場合は、 O(length yourList) 線形時間になります。

reverse patientList
于 2013-03-18T13:28:43.587 に答える
4

You could use an IntMap, from the containers package.

import Data.IntMap (IntMap)
import qualified Data.IntMap as IntMap

type PatientList = IntMap String

registerPatient :: PatientList -> String -> PatientList
registerPatient pList name
  | IntMap.null plist = IntMap.singleton 1 name  
  | otherwise         = let (n, _) = findMax pList 
                        in IntMap.insert (succ n) name plist
于 2013-03-18T13:23:24.123 に答える
2

前に述べたように、速度が問題にならない場合は長さを使用します

add :: String -> [(String, Int)] -> [(String, Int)]
add name xs = xs ++ [(name, length xs)]

ただし、要素を削除すると、IDが台無しになる可能性があります

add name xs = xs ++ [(name, 1 + ( snd (last xs) ) )]

私はghcを搭載したコンピューターではないため、これを実行しようとはしていませんが、アイデアは得られるはずです。

于 2013-03-18T13:23:24.520 に答える