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