2

とは(n+1)どういう意味ですか? どちらも Haskell の再帰関数であり、パターン マッチングを使用していることを理解しています。

の右側の とfactorial (n+1)同様に、どのようにパターン マッチするのかわかりません。(n+1)factorial =

そして、drop関数ではなぜdrop 0 xs = xsですか?そしてどうdrop (n+1) [] = []ですか?

--Example 1
factorial 0 = 1
factorial (n+1) = (n+1) * factorial n

--Example 2
drop :: Int -> [a] -> [a]
drop 0 xs = xs
drop (n+1) [] = []
drop (n+1) (_:xs) = drop n xs

ちなみに、コンパイル時にエラーが発生します。

  • コードのコンパイルに失敗しました
  • パターンの解析エラー: n + 1

更新: 正しい用語を教えてくれてありがとう。このn+k のパターンを見つけました。n+k パターンは 2010 年以降削除されているため、このパターンを有効にする方法に関するこの質問も見つけました。

4

3 に答える 3

7

これらはNPlusKPatternsで、2010 年に言語から削除され、現在は上記の言語拡張でのみ使用できます。

n + kパターン_

drop (n+1) [] = []

n引数の値が である場合、引数の値から 1 を引いた値にバインドします>= 1。パターンが引数と一致しません<= 0

だからもし

drop :: Int -> [a] -> [a]
drop 0 xs = xs
drop (n+1) [] = []
drop (n+1) (_:xs) = drop n xs

次のような負のInt引数で呼び出されます

drop (-2) "foo"

パターンが一致せず、例外が発生します。

一般に、定義すると(愚かな例の場合)

foo :: Int -> Int
foo (n+5) = 3*n
foo (n+2) = n
foo (n+1) = 2*n

を呼び出すfoo 7と、最初のパターンが一致し、nにバインドされ2ますfoo 7 = 6。を呼び出した場合foo 3、最初のパターンは ( 3-5 = -2 < 0) に一致しませんが、2 番目のパターンは一致し、それが にバインドnされる3-2 = 1ため、foo 3 = 1. を呼び出すとfoo 1、最初の 2 つのパターンはどちらも一致しませんが、最後のパターンは一致し、 にnバインドされ1 - 1 = 0ますfoo 1 = 0foo引数を指定して呼び出すと< 1、例外が発生します。

そして、ドロップ機能ではなぜdrop 0 xs = xsですか?そしてどうdrop (n+1) [] = []ですか?

drop 0リストの先頭から 0 要素を削除するので、リストの引数はまったく変更されません。また、空のリストから要素を削除することはできないためdrop (n+1) [] = []、エラーを発生させる以外にできる唯一のことです。

于 2013-06-26T11:23:40.520 に答える
6

いわゆるn+kパターンです。パターン(n+1)は任意の正の整数に一致しn、その整数から 1 を引いた値を返します。したがって、値を呼び出すとdrop 1 xs、の値はn0 になります。

それはなぜですdrop 0 xs = xs

リストから 0 個の要素を削除すると、同じリストになってしまうからです。

そしてどうdrop (n+1) [] = []ですか?

つまり、空のリストからいくらかでも項目を削除すると、リストは空のままになります。エラーメッセージで失敗する以外に、それが実際にその場合にできる唯一の賢明なことです。

于 2013-06-26T11:23:52.383 に答える
3

あなたが提供したコードはNPlusKPatterns、標準の haskell の一部ではなくなった (標準にはない) という機能を使用していますが、ソース ファイルの先頭にhaskell2010行を追加することで "インポート" することができ ます。{-# LANGUAGE NPlusKPatterns #-}

使用方法の例を見てみましょう。

myFunction 0 = 0
myFunction (n+1) = n

この関数はややばかげています。入力が の0場合、結果は0です。正の入力数値mの場合、結果は です。m - 1別の言い方をすれば、正の入力数値n+1の場合、結果はnです。(n+1)パターンが負の数と一致しないため、関数は負の数に対して未定義です。

ここで、関数を次のように変更したとしましょう

myFunction 0 = 0
myFunction (n+1) = (n+1)

今、左側はいくつかの魔法を行います. n1 から入力を引いた変数を宣言します。一方、右側は(+)演算子で 1 を追加します。

機能についてのご質問についてdropdrop 0 xs = xsリストから要素を削除0してもリストは変更されないことを意味します。drop (n+1) [] = []空のリストから正の数の要素を削除すると、空のリストになります。

レポートdropからの定義は次のとおりです。haskell2010

drop n xs     | n <= 0 =  xs
drop _ []              =  []
drop n (_:xs)          =  drop (n-1) xs

負の数に対して定義されているため、動作が多少異なります。

于 2013-06-26T13:25:52.653 に答える