質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Haskell

Haskellは高い機能性をもった関数型プログラミング言語で、他の手続き型プログラミング言語では難しいとされている関数でも容易に行うことができます。強い静的型付け、遅延評価などに対応しています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

Q&A

解決済

1回答

1552閲覧

カリー化と部分適用の使い所や使い分けについて

maikeru

総合スコア68

Haskell

Haskellは高い機能性をもった関数型プログラミング言語で、他の手続き型プログラミング言語では難しいとされている関数でも容易に行うことができます。強い静的型付け、遅延評価などに対応しています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

0グッド

1クリップ

投稿2021/07/02 02:40

カリー化と部分適用はどのような処理をするときに有用でどのように使い分けるべきでしょうか

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

K_3578

2021/07/02 02:41

質問を解決する前に次々質問しないでください。 自分で調べて何も出なかったのですか?
maikeru

2021/07/02 02:45

> 質問を解決する前に次々質問しないでください。 他の回答がつくかも知れないので質問を解決するのは少し待つことにしています > 自分で調べて何も出なかったのですか? 自分でも調べています
K_3578

2021/07/02 02:56 編集

基本的に質問を連投するのはマナーとして良くありません。 質問は一つずつにするべきです。 質問するときのヒント(https://teratail.com/help/question-tips )は 質問をするなら必読するべき内容です。
maikeru

2021/07/02 02:53

> 基本的に質問を連投するのはマナーとして良くありません。 そのようなマナーがあるのですね 質問するときのヒントは初めて見ました。気をつけます
maisumakun

2021/07/02 02:54

> 自分でも調べています 調べてどのような情報が得られて、それでもわからない部分はどのようなものでしょうか? (何も提示されていないと、「何もしていない」のと閲覧者からみて区別ができませんし、「同じ情報を再提示されるだけ」という無駄な労力が発生する危険もあります)
gentaro

2021/07/02 04:57

質問を連投するのは構わないと思うけど、最低限質問ガイドラインに沿って必要な情報ぐらい書こう。この内容での連投ならただのスパム。
guest

回答1

0

ベストアンサー

カリー化は複数引数を取る関数引数ひとつを取り関数を返す関数にすることです。Haskell では普通に作成した関数はカリー化がなされています。例えば以下のような関数があるとしましょう。

haskell

1add :: Int -> Int -> Int 2add x y = x + y

この関数は複数引数を取る関数ではなく引数ひとつを取り関数を返す関数です。次に add を使って 3 だけ足す関数を考えてみます。

haskell

1add3 :: Int -> Int 2add3 x = add 3 x

このように書いても問題はないのですが、型を見ると Int -> Int 型を返しても良いことになっています。ですから add3部分適用を用いて以下のようにも書けます。

haskell

1add3 :: Int -> Int 2add3 = add 3

部分適用を用いるとある値に対する特別バージョンの関数を作れることになります。何回も 3 を加える処理が必要な場合、add3 を作成しておくのは有効でしょう。

カリー化についてもう一つ。カリー化は 複数引数を取る関数を引数ひとつを取り関数を返す関数にすることと言いましたが、Haskell ではタプルを使って複数の引数が渡せます。

haskell

1add' :: (Int, Int) -> Int 2add' (x, y) = x + y

これを引数ひとつを取り関数を返す関数にすることもカリー化と呼び、その関数は以下のように書けます(標準で入ってます)。

haskell

1curry :: ((a, b) -> c) -> (a -> b -> c) 2curry f = \x y -> f (x, y)

何らかの理由により引数がタプルを取っているけど部分適用したい時に使えるでしょう。

投稿2021/07/02 05:11

A_kirisaki

総合スコア2853

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問