2

重複の可能性:
この ghci セッションの型で何が起こっているのですか?

Haskell を少し練習してポイントフリーについて学ぶために、数を 2 乗する関数をいじっていました。

だから私は定義することから始めました

>let dup f x = f x x

そのため、sq を dup に関して書き換えることができました (今のところ、dup ポイントを無料にすることを心配する必要はありません)。

>let sq x = dup (*) x

そしてsqのタイプをチェックすると、私が期待しているものがわかります

>:t sq
>sq :: Num t => t -> t

だから私はxを削除して取得します

>let sq = dup (*)
>:t sq
sq :: Integer -> Integer

私は何が欠けていますか?

4

1 に答える 1

3

単相制限に遭遇しました。Haskellは、「関数」スタイルで指定されていない限り、関数のポリモーフィック型を推測しません(ポイントフリーではありません)。これはlet sq = dup (*)、型チェックを行わないことを意味しますが、Haskellは、標準の数値クラスに対していわゆる「デフォルトルール」を持っています。これは、デフォルトで単相型「整数->整数」になることを意味します。

Prelude> :set -XNoMonomorphismRestriction
Prelude> let dup f x = f x x
Prelude> let sq = dup (*)
Prelude> :t sq
sq :: Num t => t -> t
于 2012-07-04T23:20:04.570 に答える