これはハスケル高次関数ですか?

シフトが高階関数であるかどうかを知りたい。

chartoInt  :: Char -> Int
chartoInt c  =  ord c 

Inttochar  :: Int -> Char
Inttochar  n   =  chr n

shift :: Int -> Char -> Char
shift n c  =  Inttochar  (chartoInt c + n)
0

3 答え

これらの関数のどれもがパラメータとしての関数をとらないため、高次関数はありません。

shift's parameters are n (an Int) and c (a Char): neither are functions.

(また、 Inttochar inttochar でなければなりません:Haskellの関数名は大文字で始めることはできません)。


shift のような高階関数があります:

higherShift :: (Int -> Char) -> Int -> Char -> Char
higherShift f n c = f (chartoInt c + n)

shift = higherShift inttochar   -- same as your original shift

または、おそらくもっと便利です:

anotherHigherShift :: (Int -> Int) -> Char -> Char
anotherHigherShift f c = inttochar (f (chartoInt c))

shift n = anotherHigherShift (+n)   -- same as your original shift

anotherHigherShift のタイプシグネチャは、次のように読むことができます

  • it's a function
  • whose first parameter is a function (this function takes an Int and returns an Int)
  • whose second parameter is a Char
  • and which returns a Char

(+n) is shorthand for \m -> m + n.

5
追加された
@ user1150071私の編集を参照してください。今は明らかですか?
追加された 著者 dave4420,
@ user1150071を高次関数にするには、関数を引数として取る必要があります(それを:p)。
追加された 著者 ivanm,
@ dave4420 yep.its今クリアする。私はhigherShift機能が第2のものよりもはっきりしていると思う。
追加された 著者 user1150071,
シフト関数を高階関数に変更する方法を知りたい
追加された 著者 user1150071,
help @ dave4420。ありがとうございます.2つ目の例を簡単に説明してくださいanotherHigherShift code.i特別にこの行(Int - > Int) - > Char - > Charとshift n = anotherHigherShift(+ n)関数を理解できません
追加された 著者 user1150071,

そうです。

シフトは高次関数である。

shift :: Int -> (Char -> Char) -- The long prototype.

Int を取得し、 Char を取得して Char を返す関数を返します。

P.S. inttochar を記述する必要があります。

2
追加された
@Michas Haskellの関数は通常カレー化されているので、単に関数を返す関数は、Haskellでは高次関数とはみなされません。したがって、パラメータとして他の関数を使用する関数は高次関数です。
追加された 著者 dave4420,
最初の文をクォートする:高次関数は、他の関数を引数として取るか、結果として関数を返す関数です。
追加された 著者 Michas,
@ivanmあなたは私にこの定義へのリンクを与えました。間違っていると思われる場合は、このタグwikiも編集してください。 stackoverflow.com/tags/higher-order-functions/info をご覧ください。
追加された 著者 Michas,
高次関数の定義とは何ですか?
追加された 著者 Michas,
それは高次関数にはなりません。それは、関数を取るのではなく関数を返すためです。
追加された 著者 ivanm,
追加された 著者 ivanm,
@Michasは新しいものを構築することによって;私はその定義がどこからでも使われるのを見たことがありません(そして私はそれがウィキペディアから取られたと信じています)。したがって、FP言語の場合、HOFの有用な定義は、別の関数をパラメータとして取るものです。
追加された 著者 ivanm,
だから私はそれをもっと徹底的に読んでいたはずです;-)私はこれまで定義のその部分を誰も使用したことがないのです。それで、私の謝罪。しかし、Haskellのコンテキストでは、それはやや些細で退屈な側面です:)
追加された 著者 ivanm,
@ user1150071 "高次関数"が何を意味するかの技術的定義によって、それはあります。通常、この用語がハスケルで使用されるときに意味される有用な定義によって、
追加された 著者 ivanm,
おそらく、デフォルトでカレーされているhaskellやその他の言語を区別することをお勧めします。 C#のような言語では、比較的まれなので、別の関数を返す関数のクラスに明示的に名前を付けると意味があります。しかし、これはhaskellでは複数の引数を持つすべての関数を含むため、この区別はそれほど有用ではありません。ところで、コメントの文書への明示的な参照の良い仕事。
追加された 著者 Boris,
あなたの最終決定は何ですか?私の最初のコードの高次関数ですか?
追加された 著者 user1150071,

非公式の規則があります:関数の型を見てください。中カッコ(必要に応じて[1])が含まれている場合は、より高次の関数です。

[1]それらを省略すると、タイプが変わるという意味です。

そして今、この観点からの最初の答えからあなたの関数と関数の型を見てみましょう。それは簡単です。

2
追加された
私はあなたの意図を見ますが、あなたはそれを正確に表現していません、IMHO。 foo :: Maybe(Either Int Char) - > Bool
追加された 著者 Ingo,
"中かっこ" == "かっこ"
追加された 著者 amindfv,