2017-10-17 3 views
1

なぜputStr (printf "abc%d\n" 3)で曖昧3のですか?つまり、なぜスクリプト内で3の型を宣言しなければならないのですか?しかしghciでは宣言する必要はありません。ここなぜスクリプトに対して数字の型をprintf(putStrと一緒に使用する)で宣言する必要がありますが、ghciでは宣言しないでください。 GHCiの中で実行しているときにスクリプトとして実行されているが、その後<strong>ない</strong>あいまいなとき

ghci内の操作である:Intとして宣言する際ここ

$ ghci 
GHCi, version 7.6.3: http://www.haskell.org/ghc/ :? for help 
Loading package ghc-prim ... linking ... done. 
Loading package integer-gmp ... linking ... done. 
Loading package base ... linking ... done. 
Prelude> putStr "abc3\n" 
abc3 
Prelude> import Text.Printf 
Prelude Text.Printf> printf "abc%d\n" 3 
abc3 
Prelude Text.Printf> let main = putStr (printf "abc%d\n" 3) 
Prelude Text.Printf> main 
abc3 
Prelude Text.Printf> let main = printf "abc%d\n" 3 :: String 
Prelude Text.Printf> main 
"abc3\n" 
Prelude Text.Printf> :quit 
Leaving GHCi. 

scriptの正しい動作である:ここ

$ cat runmain-good 
#!/usr/bin/env runghc 
import Text.Printf 
main = putStr (printf "abc%d\n" (3 :: Int)) 
$ ./runmain-good 
abc3 

3のタイプである場合とscriptの誤操作でありますあいまいではありません...典型的なユーザーフレンドリーなHaskellエラー:

$ cat runmain-bad 
#!/usr/bin/env runghc 
import Text.Printf 
main = putStr (printf "abc%d\n" 3) 
$ ./runmain-bad 

runmain-bad:3:16: 
    No instance for (PrintfArg a0) arising from a use of `printf' 
    The type variable `a0' is ambiguous 
    Possible fix: add a type signature that fixes these type variable(s) 
    Note: there are several potential instances: 
     instance [safe] PrintfArg Char -- Defined in `Text.Printf' 
     instance [safe] PrintfArg Double -- Defined in `Text.Printf' 
     instance [safe] PrintfArg Float -- Defined in `Text.Printf' 
     ...plus 12 others 
    In the first argument of `putStr', namely `(printf "abc%d" 3)' 
    In the expression: putStr (printf "abc%d" 3) 
    In an equation for `main': main = putStr (printf "abc%d" 3) 

runmain-bad:3:33: 
    No instance for (Num a0) arising from the literal `3' 
    The type variable `a0' is ambiguous 
    Possible fix: add a type signature that fixes these type variable(s) 
    Note: there are several potential instances: 
     instance Num Double -- Defined in `GHC.Float' 
     instance Num Float -- Defined in `GHC.Float' 
     instance Integral a => Num (GHC.Real.Ratio a) 
     -- Defined in `GHC.Real' 
     ...plus 11 others 
    In the second argument of `printf', namely `3' 
    In the first argument of `putStr', namely `(printf "abc%d" 3)' 
    In the expression: putStr (printf "abc%d" 3) 
+0

あなたはputStrが必要ではないことは知っていますか? – augustss

+0

ありがとう@augustss。私はこれを知らなかった。私はちょうどあなたのヒントを試しました。もちろん、 'putStr'を削除しても_literal 3 ambiguous_エラーは削除されません。しかし、正しい式は 'main = printf" abc%d \ n "(3 :: Int)'に減少します。 ... Haskellの数学的な簡潔さは、アルゴリズムの本質、特にHindley-Milnerの強力な使用を照らし出すのに役立つので、最も美しい特徴の1つです。この数はこの状況で曖昧さを解消できません。 –

答えて

4

GHCiはデフォルトで有効になっているリラックスしたデフォルトルール(文字通り5のデフォルトはInteger)を使用しています。

ExtendedDefaultRulesを有効にすると、GHCでも同様の効果が得られます。

詳細については、GCHi docsを参照してください。

関連する問題