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

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

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

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

Q&A

解決済

3回答

1263閲覧

関数合成の際の恒等式(?)について

takagitakashi

総合スコア15

Haskell

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

1グッド

0クリップ

投稿2017/12/19 02:03

編集2017/12/19 02:06

Haskell の関数合成でよくわからなくなったので、質問させてください。

Haskell

1f = \x -> x+2 2g = \x -> x*2

の時、

  • f $ g 2
  • f.g 2
  • (f.) g 2
  • (.g) f 2

すべて等しくなります。

Haskell

1import Data.Char 2f = ord 3g = chr

でも同様です。
一般に

Haskell

1f $ g x == (f.g) x == (f.) g x == (.g) f x

が成立するのでしょうか?
最後の (.g) だけ違和感があるのですが。。

maisumakun👍を押しています

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

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

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

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

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

igrep

2017/12/19 03:37 編集

`f.g 2` ではなく `(f.g) 2` ではありませんか? 後半の恒等式では `(f.g) 2` となっていますが、念のため。
takagitakashi

2017/12/19 04:13

おはずかしい。その通りでございます。
guest

回答3

0

お二人に回答いただき、以下は常に成立する(というより定義?)という理解に達しました。

op f g
= f op g
= (f op) g
= (op g) f

なので、op = . のとき

(.) f g
= f.g
= (f.) g
= (.g) f

ありがとうございました。

投稿2017/12/19 04:56

takagitakashi

総合スコア15

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

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

0

ベストアンサー

(.g) f x について、

f.g = \x -> f (g x)なので

(.g) = \f -> \x -> f (g x)
((.)g(.g)の違いに注意)

つまり
(.g) f x = f (g x)

なのかなぁ?


中置演算子opに対する部分適用:
(f op)(op g)が何になるかは以下参考

Haskell のセクションと中置記法

投稿2017/12/19 02:31

編集2017/12/19 04:19
ozwk

総合スコア13512

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

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

takagitakashi

2017/12/19 04:23

(.) g と (.g)の違いに注意、とありますが、どのように違うのでしょうか? *Main> let g = (+2) *Main> :t g g :: Num a => a -> a *Main> :t (.g) (.g) :: Num b => (b -> c) -> b -> c *Main> :t ((.) g) ((.) g) :: Num c => (a -> c) -> a -> c 違いが無いように見えるのですが。。。
ozwk

2017/12/19 04:31

2つともb,cで表すように 後者のaをbにして揃えると Num b => (b -> c) -> b -> cと Num c => (b -> c) -> b -> cですけど
takagitakashi

2017/12/19 04:37 編集

なるほど。型が違うんですね。 ご教示いただいたサイトの表記だと、 (`op` g) と (op g) の違い、ということですね。
ozwk

2017/12/19 04:37

型が違うので意味も違います。 参考リンクにも例で出てくる/がわかりやすいかと (/)2は2を割る (/2)は2で割る のように
takagitakashi

2017/12/19 04:38

あ、、すいません、入れ違いになってしまいました。。よく理解できました!重ね重ねありがとうございます。
guest

0

(.g) hogef hoge といった関数呼び出しは左結合なので、

(.g) f x にカッコを補うと ((.g) f) x となります。

で、ご存じのとおり (.g) ff.g と等価なので、
((.g) f) x は結果 ((f.g) x) と等価になります。

(f.) g x についても同様で、カッコを補うと ((f.) g) x になることから、
(f.) g(f.g) と等価なので、
((f.) g) x((f.g) x) と等価になります。

f $ g x についても、ご認識の通りです。
一般によくある書き換えイディオムとして覚えておくといいと思います。

投稿2017/12/19 03:44

編集2017/12/19 03:47
igrep

総合スコア428

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

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

takagitakashi

2017/12/19 04:12

回答ありがとうございます。 かっこの補い、お手間かけます。。。 自分が聞きたいのは、 「(.g) fは (f.g) と等価」 「(f.) gは (f.g)と等価」 の理由なのですが、、、 これは自明なんでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問