2009-07-22 21 views

答えて

3

まあ、エリックの答えの欠点がありますそれはリストのすべての要素に対してOddQを実行するということです。私の呼び出しは比較的コストがかかり、頻繁に計算するのは間違いです。また、ランダム性の要素は明らかに不要であり、最初のものは私にとっては問題ありません。

だから、どのように

SelectAny[list_List, criterion_] := 
Catch[Scan[ If[criterion[#], Throw[#, "result"]] &, list]; 
    Throw["No such element"], "result"] 

そして

SelectAny[{1, 2, 3, 4, 5}, OddQ] 

戻り1.

私はまだ何かをしたいがMathematicaに組み込まれた

について。自家製の機能を使用すると、直接的な利益をほとんど得ずにプログラムを拡大することができます。

+0

Mathematicaには、すでに理解できないほど多数の組み込み関数が含まれているようです。いくつかの段階では、すべてのことが箱から提供されるわけではないことを認めなければならないと思います。 –

1

条件を満たすすべての要素を取得する「選択」があります。だから、あなたがランダムに単一のマッチング要素を選択すること

In[43]:= Select[ {1, 2, 3, 4, 5}, OddQ ] 
Out[43]= {1, 3, 5} 

かを意味していますか?私は、組み込みの何も知りませんが、あなたはかなり迅速にそれを定義することができます。

あなたが同じように使用することができ
Any[lst_, q_] := 
    Select[ lst, q] // (Part[#, 1 + Random[Integer, Length[#] - 1]]) & 

を::

In[51]:= Any[ {1, 2, 3, 4, 5}, OddQ ] 
Out[51]= 3 
1

あなたはScanReturn

fstp[p_, l_List] := Scan[ [email protected]# && [email protected]# &, l ] 

ので

In[2]:= OddQ ~fstp~ Range[1,5] 
Out[2]= 1 
In[3]:= EvenQ ~fstp~ Range[1,5] 
Out[3]= 2 

で比較的容易にそれを行うことができます私は本当に、Mathematicaは遅延評価式を作るためにいくつかのオプションを持っていることがしたいです。あなただけの結果の最大数がある、Selectにオプションの第三引数を、最初に一致した要素の後に戻ります使用したい場合は、このようなHaskellのよう怠惰な言語では、あなただけの通常の

fstp p = head . filter p 
+1

通常、シンボルのHoldFirst/HoldRest/HoldAll属性を使用して遅延評価を適切に近似することができます。また、サンクとして包み込むことによって遅らせることもできます。 – Pillsy

7

としてそれを定義することができます戻る。だから、あなたはそれが複数の戻り値、またはHaskellのMaybeタイプの同等に欠けているので、Mathematicaは、答えを見つけるために失敗したことを知らせるための素晴らしい方法を欠い

Any[list_List, crit_, default_:"no match"] := 
    With[{maybeMatch = Select[list, crit, 1]}, 
     If[maybeMatch =!= {}, 
      First[maybeMatch], 
      default] 

行うことができます。私の解決策は、ユーザーが指定できるデフォルト値を持つことです。したがって、有効な回答と容易に区別できるものを渡すことができます。

3

Select機能が選択する項目の最大数を示し、その3番目の引数を介して、このビルトイン提供:

In[1]:= Select[{1, 2, 3, 4, 5}, OddQ, 1] 
Out[1]= {1} 

なし一致:

In[2]:= Select[{2, 4}, OddQ, 1] 
Out[2]= {} 

編集:おっと、逃しnes1983はすでにこれを述べている。

+0

nes1983の答えにセレクトの第3引数の言及がありません。私にはこれが受け入れられた答えになるはずです。 – dreeves

+0

ああ、あなたはピルシーを意味していたに違いない。 – dreeves

関連する問題