type の may array 内の要素の位置を取得する必要がありArray Int Int
ます。elemIndex
方法またはfind
位置を取得する方法を見つけました。私の問題は、Just 5
たとえばプレフィックスが必要ないことです。では、私の例で番号だけを取得するにはどうすればよい5
ですか?
2 に答える
原則
値から値を安全に抽出するMaybe a
には、次のようにパターン マッチングを使用できます。
case elemIndex 'C' list of
Just n -> "You can find C at position " ++ show n
Nothing -> "There is no C in the list."
これは次のようなものを返します
"You can find C at position 2"
また
"There is no C in the list."
リストに C があるかどうかによって異なります。
便利にする
もちろん、この種のパターン マッチングを常に記述するのは扱いにくいため、maybe
ほとんど同じことを行う と呼ばれる関数が存在します。その型シグネチャを見ると、
maybe :: b -> (a -> b) -> Maybe a -> b
したがって、 type の「デフォルト値」と to からの関数を取り、をb
返します。これがデフォルト値であるかどうかは、値が存在するかどうかによって異なります。たとえば、リスト要素が 18 歳以上のクラブへの入場を許可されているかどうかを確認する場合は、次のようにします。a
b
b
Maybe a
Nothing
maybe False (\n -> n >= 18) (elemIndex 'C' list)
インデックスが 18 未満の場合、または要素がリストに存在しない場合、これは False になります。存在する場合は、18 以上かどうかを確認し、True を返します。
維持するJust
ここまでお伝えしたのJust
は、安全な方法で を取り除く方法です。の代わりに が手元にある場合Just
、返すべき適切な値がない場合もあります。その場合にできることは、値がまだ の中にあるときに値を操作することです。たとえば、just 内の値から 15 を引くには、次のようにします。Nothing
Just
Just
fmap (subtract 15) (Just 23)
戻ります
Just 8
これで、どのfmap
ように値を取りJust something
、関数をそのsomething
部分に適用し、Just
外側を保持するかがわかります。あなたがするなら
fmap (subtract 15) Nothing
を保持するだけNothing
なので、結果は次のようになります
Nothing
安全ではない(子供たち、家でこれを試さないでください!)
Maybe
Do Things Right を強制するエラー処理システムであるため、優れています。エラー ( で表される) の可能性を無視することはできませんNothing
。別の一般的なエラー処理システムは、これに関してひどいものです。そのシステムは例外のシステムです。非常に危険なプログラムの基礎となる例外が発生する可能性があることをあからさまに無視しても、誰にもわかりません。
したがって、 を捨てることができるまで保持し、同時に潜在的な値を適切なものに置き換える必要があります。Just
Nothing
値の可能性がないことを保証できる場合。要素を呼び出すたびに list のどこかにあることが確実にわかっている場合は、を使用してもかまいません。そこに値がない場合に何が起こるかを気にせずに、やみくもに a から値を取り出そうとします。何か問題が発生した場合、単にプログラムを爆発させます (例外をスローします)。Nothing
elemIndex
fromJust
fromJust
Just
Just
fromJust
お分かりのように、細心の注意を払って使用する必要があります。
スタイルに不安を感じる
ただし、Jedai がコメントで指摘しているように、Nothing
値を取得できない場合でも、それについて明示した方がよいでしょう。を使用する代わりに、次のfromJust
ようなことを検討してください
fromMaybe (error "The input " ++ show list ++ " shouldn't create a Nothing value!")
(elemIndex 'C' list)
これは非常に具体的なエラー メッセージで爆発し、何か問題が発生した場所を特定します。
これはもちろん、次のようなパターン マッチと同じことです。
case elemIndex 'C' list of
Just n -> n
Nothing -> error "The input " ++ show list ++ " shouldn't create a Nothing value!"
fromMaybe
標準関数に圧縮されるだけです。