2

私は Haskell の初心者なので、この質問が些細なことだと思ったらすみません:

この種の宣言を GHCi に受け入れさせるにはどうすればよいでしょうか: let foo = fmap (*3) . fmap (+10)?

let foo :: [Int] -> [Int] =ファンクターの型を明示的にするために foo (など) に型宣言を追加しようとしましたが、コンパイラーが応答しIllegal Signatureます。

ありがとう!

編集 - どうやらこれを行うにはかなりの方法があります。私が Tikhon の回答を選んだのは、彼が最初であり、かなり直感的だったからです。みんな、ありがとう!

4

4 に答える 4

9

ghci で型シグネチャを指定するには、拡張子を必要としない最善の方法は、シグネチャとバインディングをセミコロンで区切ることです。

let foo :: Num n => [n] -> [n]; foo = map (*3) . map (+ 10)
于 2012-08-01T00:04:31.387 に答える
5

式 (つまり、fmap (* 3) . fmap (+ 10)) に署名を与えるのではなく、署名を与えることができfooます。そう:

let foo = fmap (* 3) . fmap (+ 10) :: [Int] -> [Int]
于 2012-08-01T00:00:04.227 に答える
3

完全なエラーは次のとおりです

Illegal signature in pattern: [Int] -> [Int]
    Use -XScopedTypeVariables to permit it

解決策は実行することです

:set -XScopedTypeVariables

これで、を実行してみてください。動作しますlet foo :: [Int] -> [Int] = fmap (*3) . fmap (+10)

于 2012-07-31T23:59:29.873 に答える
1
:set -XNoMonomorphismRestriction
于 2012-08-01T00:02:40.813 に答える