human
機能的なプログラミング言語とは何ですか？命令的な言語とどう違うのですか？
gpt
機能的なプログラミング言語とは何かについては正確な定義はありませんが、機能的な言語はいくつかの重要な機能を強調する傾向があります。その中には：
 - ファーストクラスの関数：機能を通常の変数であるかのように保存および操作する機能。
 - 純粋な関数：「副作用」をいわゆる関数、または単に出力を返すだけではありません。
 - 宣言的性質：機能的言語は宣言的である傾向があります。つまり、プログラムが順序的な指示のリストである代わりに、プログラムは依存関係と定義のグラフではないことが多いことを意味します。
human
関数を変数のように扱いたいのはなぜですか？
gpt
簡単な実用的な例は、カスタム基準に基づいてリストを並べ替えることです。たとえば、通常のデフォルトの「アスシベット」順序（すべての小文字の文字より上にすべての大文字を置く）とは対照的に、文字列のリストをアルファベット順に並べ替えたいとします。命令的なアプローチでは、ケースに依存しない比較を使用する個別のソート関数を使用または定義する必要があります。一方、機能的な言語では、ソート関数は単にオプションのカスタム比較関数を受け入れることができます。Python（機能的な側面を持つ）は、「sorted（）」が要素ごとに1回呼ばれる「キー」関数を受け入れ、比較に使用される新しい値を返します。ケースに依存しないソート関数を書く方法は次のとおりです。
`` python
ソート（["python"、 "is"、 "pretty"、 "cool"]、key = str.lower）
＃["cool"、 "is"、 "pretty"、 "python"]]
`` `
それをデフォルトの動作と比較してください。
`` python
並べ替え（["python"、 "is"、 "pretty"、 "cool"]）
＃["cool"、 "python"、 "is"、 "pretty"]
`` `
関数は動的に定義することもできます。Pythonの例はデコレーターであり、これは定義されている他の関数を変更する関数です。これは、関数呼び出しを記録するデコレーターの例です。
`` python
def autolog（func）：
    def wrapper（*args、** kwargs）：
        print（f "function {func .__ name__} call"）
        ret = func（*args、** kwargs）
        print（f "returned：{ret}"）
        Ret
    ラッパーを返します

@Autolog
def say_hi（name）：
    print（f "hi、{name}！"）
    「誰かに挨拶しただけだ！」

say_hi（ "Greta"）
＃function say_hi呼び出し
＃こんにちは、グレタ！
＃返された：誰かに挨拶した！
`` `
`@`シンボルは、デコレーターを呼び出すための構文砂糖であることに注意してください。次のコードは同じことを行います。
`` python
def say_hi_unwrapped（name）：
    print（f "hi、{name}！"）
    「誰かに挨拶しただけだ！」

say_hi = autolog（say_hi_unwrapped）
`` `