0

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

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)
4

3 に答える 3

5

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

shiftのパラメータはn(an Int) とc(a Char) です。どちらも関数ではありません。

(また、次の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ように読むことができます。

  • それは関数です
  • 最初のパラメーターは関数です (この関数は を取り、Intを返しますInt)
  • 2 番目のパラメータはChar
  • そして、これはChar

(+n)の省略形です\m -> m + n

于 2012-02-06T09:52:16.730 に答える
2

です。

シフトは高次関数です。

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

getIntと return 関数のgetCharとreturnCharです。

PSあなたは書くべきinttocharです。

于 2012-02-06T10:01:40.403 に答える
2

非公式のルールがあります: 関数の型を見てください。(必要に応じて [1]) 中括弧が含まれている場合、それは高階関数です。

[1] 省略すると型が変わるという意味で。

そして、この観点から、最初の回答から関数のタイプと関数を見てみましょう。それは簡単です。

于 2012-02-06T15:37:02.697 に答える