0

type の may array 内の要素の位置を取得する必要がありArray Int Intます。elemIndex方法またはfind位置を取得する方法を見つけました。私の問題は、Just 5たとえばプレフィックスが必要ないことです。では、私の例で番号だけを取得するにはどうすればよい5ですか?

4

2 に答える 2

7

原則

値から値を安全に抽出する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 歳以上のクラブへの入場を許可されているかどうかを確認する場合は、次のようにします。abbMaybe aNothing

maybe False (\n -> n >= 18) (elemIndex 'C' list)

インデックスが 18 未満の場合、または要素がリストに存在しない場合、これは False になります。存在する場合は、18 以上かどうかを確認し、True を返します。

維持するJust

ここまでお伝えしたのJustは、安全な方法で を取り除く方法です。の代わりに が手元にある場合Just、返すべき適切な値がない場合もあります。その場合にできることは、値がまだ の中にあるときに値を操作することです。たとえば、just 内の値から 15 を引くには、次のようにします。NothingJustJust

fmap (subtract 15) (Just 23)

戻ります

Just 8

これで、どのfmapように値を取りJust something、関数をそのsomething部分に適用し、Just外側を保持するかがわかります。あなたがするなら

fmap (subtract 15) Nothing

を保持するだけNothingなので、結果は次のようになります

Nothing

安全ではない(子供たち、家でこれを試さないでください!)

MaybeDo Things Right を強制するエラー処理システムであるため、優れています。エラー ( で表される) の可能性を無視することはできませんNothing。別の一般的なエラー処理システムは、これに関してひどいものです。そのシステムは例外のシステムです。非常に危険なプログラムの基礎となる例外が発生する可能性があることをあからさまに無視しても、誰にもわかりません。

したがって、 を捨てることができるまで保持、同時に潜在的な値を適切なものに置き換える必要があります。JustNothing

値の可能性がないことを保証できる場合。要素を呼び出すたびに list のどこかにあることが確実にわかっている場合は、を使用してもかまいません。そこに値がない場合に何が起こるかを気にせずに、やみくもに a から値を取り出そうとします。何か問題が発生した場合、単にプログラムを爆発させます (例外をスローします)。NothingelemIndexfromJustfromJustJustJustfromJust

お分かりのように、細心の注意を払って使用する必要があります。

スタイルに不安を感じる

ただし、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標準関数に圧縮されるだけです。

于 2013-11-03T14:28:56.273 に答える