リストを調べる簡単な方法はありますか?リストの5番目のデータにアクセスしたかったのですが、それがBであることがわかりませんでした。
["A","A","A","A","B","A","A","A","A"]
リストを並べ替えることなくそれを行う方法はありますか?
リストを調べる簡単な方法はありますか?リストの5番目のデータにアクセスしたかったのですが、それがBであることがわかりませんでした。
["A","A","A","A","B","A","A","A","A"]
リストを並べ替えることなくそれを行う方法はありますか?
ミランダのことはよくわかりませんが、機能を期待しskipてtake利用できると思います。
スキップアンドテイクから関数を作成することで、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)
リストは帰納的データ型です。これは、リストに対して定義された関数(たとえば、n番目の要素へのアクセス)が再帰によって定義されることを意味します。探しているデータ構造は配列のように見えます。これにより、一定時間のルックアップが可能になります。リスト内のインデックスで要素を見つける最も簡単な方法は、直接次のとおりです。
lookup :: Int -> [a] -> Maybe [a]
lookup n [] = Nothing
lookup 0 (x:xs) = Just x
lookup n (x:xs) = lookup (n - 1) xs
これを行う別の方法は、!を使用することです。オペレーター。リストに次のような定義済みデータを含むプログラムがあるとします。
plist = [A,A,A,A,B,A,A,A,A]
次に実行するplist!4と、そのリストの5番目の要素が得られます。(0、1、2、3、4を含めると4が5番目のユニットになります)
したがって、plist!4Bを返します。
リストは配列ではありません。
最初から要素にのみアクセスできます。リストをストリームと考えてください(ラジオで再生される曲のように)。リストの長さは無限である可能性があります(ラジオが停止することはないため)。
ほとんどのプログラマーは「構文」糖衣を使用します。これは、リストの性質をより簡単な構文の背後に隠します。
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つは継続です。
悪いテクニックは、最初にリストの長さをチェックすることです。これは、無限のリストでクラッシュするためです。