私はを使っています。Haskellの基礎を理解するために、Haskellを学んでください。私は関数型プログラミングとパターンマッチングの両方に非常に慣れていますが、後者の方がどのようにしてMathematicaを実行するかは非常に快適です。エラーException: ... Non-exhaustive patterns in function last1
を与えたlast1 [1,2,3,4]
を呼び出し、しかしパターンを使用してn番目の要素を検索する
last1 :: [a] -> a
last1 (_:x:[]) = x
:4.1章でhead
のナイーブな実装と同じ精神で
は、私がようlast
のナイーブな実装を進めました。このエラーは、指定されたパターンがすべての可能な入力をカバーしていないことを意味し、通常はキャッチオールパターンが必要です(これは私が提供していません)。しかし、私はなぜ私が私の入力のためのエラーを得る正確にはわからない。
質問1:(私の間違ったアプローチの)私の理解では、最初の要素が_
によって捕獲され、残りは私が意図していたまさにされていない、x
に割り当てられますということです。しかし、私は[a] -> a
を指定したので、これは型エラーを返すべきではありませんが、x
がリストになりましたか?より良いの同じテーマに沿って:私は
last2 :: [a] -> a
last2 [x] = x
last2 (_:x) = last2 x
質問2(他の可能性の中でも)としてそれを書くことができます知っている - これは作業last
関数を記述する方法についてないであることを
注意Haskellのパターンマッチングを理解するには、パターンマッチングを使用して最後の要素を選択するか、より一般的には[1..10]
のような指定されたリストからn
番目の要素を選びますか?
This answerあなたはViewPatterns
拡張子とのパターンマッチングを使用して最後の要素をバインドできることを示唆しているが、のような類似した「シンプル」のパターンはMathematicaのがでhead
のためにそこにないことを奇妙に思える、私は希望第六要素と
Range[10] /. {___, x_} :> x
(* 10 *)
を選び出すために Range[10] /. {Repeated[_, {5}], x_, ___} :> x
(* 6 *)
:おそらくとしてそれを書きます
空でないリストの最後の要素を選択します。
これについては後で説明しますが、お詫び申し上げますが、それぞれのトピックとコンセプトに関連しています。違いが分かるように他の言語で処理される方法および類似点。
説明をありがとう!これはなぜそれが働いていなかったかを非常に明確にします。複数の要素に一致するパターンはありますか?例えば、Mathematicaの例(最後にある)の '{___、x_}'行で '___'は "0以上"を意味し、 "_"は "ちょうど1"を意味します。これにより、リストの構造を明示的に記述したので、最後の要素を除くすべてを破棄することができます。私はそれがおそらく構文的な砂糖であり、実際の再帰/バックトラックがフードの下に隠されていることを理解しています。 – abcd
@yodaハスケルのパターンマッチングでこれを行う方法はありません(私は少なくとも知っています)。これはMathematica固有の機能のようだ。一般に、Haskellの設計は通常、特別なデータ型を避けています(リストやタプルの素晴らしい構文を除いて)。 Haskellは、余分な荷物を言語に追加することよりも機能を好む。 – sabauma
ありがとう、それは私が考えたものです。私はこの哲学にも感謝しています...もう少し考えてください。少なくとも、私はそれに加えて関数型プログラミングを学ぶことについて心配する必要はありません! :) – abcd