0

リストを調べる簡単な方法はありますか?リストの5番目のデータにアクセスしたかったのですが、それがBであることがわかりませんでした。

["A","A","A","A","B","A","A","A","A"]

リストを並べ替えることなくそれを行う方法はありますか?

4

4 に答える 4

3

ミランダのことはよくわかりませんが、機能を期待しskiptake利用できると思います。

スキップアンドテイクから関数を作成することで、5番目の要素に対処できます。スキップアンドテイクが利用できない場合は、自分で簡単に作成できます。

スキップ:リスト内の要素のy個をスキップします。yがリスト内のアイテムの数よりも大きい場合、空のリストを返します。

take:リスト内の最初のy個の要素を取得します。yがリスト内のアイテム数よりも大きい場合、完全なリストが返されます。

skip y []     = []
skip 0 xs     = xs
skip y (x:xs) = skip xs (y-1)

take y []     = []
take 0 xs     = []
take y (x:xs) = x : take (y-1) xs

elementAt x xs = take 1 (skip x xs)
于 2011-10-29T10:16:12.567 に答える
2

リストは帰納的データ型です。これは、リストに対して定義された関数(たとえば、n番目の要素へのアクセス)が再帰によって定義されることを意味します。探しているデータ構造は配列のように見えます。これにより、一定時間のルックアップが可能になります。リスト内のインデックスで要素を見つける最も簡単な方法は、直接次のとおりです。

lookup :: Int -> [a] -> Maybe [a]
lookup n []     = Nothing
lookup 0 (x:xs) = Just x
lookup n (x:xs) = lookup (n - 1) xs
于 2011-10-29T12:35:20.657 に答える
2

これを行う別の方法は、!を使用することです。オペレーター。リストに次のような定義済みデータを含むプログラムがあるとします。

plist = [A,A,A,A,B,A,A,A,A]

次に実行するplist!4と、そのリストの5番目の要素が得られます。(0、1、2、3、4を含めると4が5番目のユニットになります)

したがって、plist!4Bを返します。

于 2013-09-18T15:27:02.720 に答える
0

リストは配列ではありません。

最初から要素にのみアクセスできます。リストをストリームと考えてください(ラジオで再生される曲のように)。リストの長さは無限である可能性があります(ラジオが停止することはないため)。

ほとんどのプログラマーは「構文」糖衣を使用します。これは、リストの性質をより簡単な構文の背後に隠します。

Mirandaは、stdenv.m学習可能なという名前のデフォルトライブラリを自動的にロードします。

ここで、問題について考えてみましょう。5番目より前のすべての要素を無視(「ドロップ」)してから、残りの残りのリストから最初の要素を取得します。

これはミランダでは次のように表現されます。

nth :: num -> [*] -> *
nth n = hd . drop (n-1)

これは、明示的な型宣言を備えた関数であり、その関数はすべてのリストで機能します(要素はワイルドカード型です*)。

サンプル:

plist :: [[char]]
plist  = ["A","A","A","A","B","A","A","A","A"]

result :: [char]
result  = nth 5 plist

エラー処理を使用して関数をコーディングする場合は、リストに5番目の要素がないことをキャッチする手法が必要です。

上で見たように、1つのテクニックは「たぶん」です。もう1つは継続です。

悪いテクニックは、最初にリストの長さをチェックすることです。これは、無限のリストでクラッシュするためです。

于 2021-09-30T10:39:50.060 に答える