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

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

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

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

Q&A

解決済

1回答

950閲覧

Haskell 関数applyの型と定義

old.exe

総合スコア23

Haskell

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

0グッド

0クリップ

投稿2021/08/02 16:37

編集2021/08/02 16:49

前提・実現したいこと

関数applyの型と定義が理解出来ません。
それぞれの説明をしてほしいです。定義はなんとなく分かります。関数apply f x は関数fを引数xに適用するというものという認識で間違いないでしょうか。解答よろしくお願いします。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

Haskell

1apply f x = f x 2 3>:type apply 4 5apply :: (a -> b) -> a -> b

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

haskell

1apply :: (a -> b) -> a -> b 2apply f x = f x

まず型の説明からします。(a -> b) -> a -> b は結合優先度に沿って括弧を補足すると (a -> b) -> (a -> b) となります。これは『「a 型の値を取って b 型の値を返す関数型」の値を取って「a 型の値を取って b 型の値を返す関数型」の値を返す関数型』です。分かりにくいですが、一旦このままにしておいて値の説明に移ります。その後また型の説明に戻ってきます。

apply f x = f x これは apply = \f -> (\x -> f x) と等価です。これを読むと『apply は「f を取って「x を取って f x を返す関数」を返す関数」である』となります。

haskell

1-- この2つは等価 2apply f x = f x 3apply = \f -> (\x -> f x)

ここで型の値の定義を照らし合わせて見てみます。

型:「a 型の値を取って b 型の値を返す関数型」の値を取って「a 型の値を取って b 型の値を返す関数型」の値を返す関数型
値:f を取って「x を取って f x を返す関数」を返す関数

値と型の組は、「f」と「a 型の値を取って b 型の値を返す関数型」が組、同じように「x を取って f x を返す関数」と「a 型の値を取って b 型の値を返す関数型」が組となります。Haskell の記法で書くと次のようになります。

haskell

1-- 「f」の型は「a 型の値を取って b 型の値を返す関数型」 2f :: a -> b 3 4-- 「x を取って f x を返す関数」の型は「a 型の値を取って b 型の値を返す関数型」 5\x -> f x :: a -> b

\x -> f x :: a -> b を同じように読み解いていくと下記のようになります。

haskell

1-- 「x」の型は「a」 2x :: a 3 4-- 「f x」の型は「b」 5f x :: b

ここまでで説明は終わりです。


おまけとして apply を TypeScript で書いてみます(Wandbox で実行)。

typescript

1const apply: <A, B>(f: (A) => B) => ((x: A) => B) = 2 function<A, B>(f: (A) => B) { return function(x: A) { return f(x); } };

投稿2021/08/03 00:01

編集2021/08/03 00:02
kakkun61

総合スコア285

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問