9

stackoverflowに関する質問に答えたところ、GHCi(インタラクティブ)がletステートメントで制限が強すぎるタイプを割り当てていることに気付きました。つまり、コードが与えられると、

import Control.Arrow
f = maximum &&& id >>> fst &&& (\(m,l) -> length $ filter (==m) l)

( https://stackoverflow.com/questions/6281813/maximum-of-list-and-count-of-repeat-maximum-number/6283594#6283594への私の回答のように)f、これをghciに入力すると、次のタイプ情報が得られます

Prelude Control.Arrow> :t f
f :: [()] -> ((), Int)

一方、式のタイプを要求するだけで、正しい結果、つまり。が得られますOrd a => [a] -> (a, Int)。ghc7.0.3を使用しています。

4

1 に答える 1

10

がどこから来ているかの説明については、GHCiで使用される拡張デフォルトルールを参照してください。()

この場合にデフォルトが発生する理由については、以下を比較してください。

> let f x = maximum &&& id >>> fst &&& (\(m,l) -> length $ filter (==m) l) $ x
> :t f
f :: (Ord a) => [a] -> (a, Int)

これはバインディングが単形であることに関係していると思いますが、詳細はわかりません。

于 2011-06-08T19:05:49.250 に答える