10

コマンドラインから int 値を取得してdisp関数に渡そうとしています。

import System(getArgs)

main = do
    args <- getArgs
    disp $ read $ head args :: Int

disp n = take n $ repeat 'S'

ghc によって与えられるエラーは

 Couldn't match expected type `Int' with actual type `[Char]'
 In the expression: disp $ read $ head args :: Int
 In the expression:
   do { args <- getArgs;
            disp $ read $ head args :: Int }
 In an equation for `main':
     main
       = do { args <- getArgs;
                  disp $ read $ head args :: Int }

ありがとう。

4

3 に答える 3

11

次のように、整数のコマンドライン引数のプルをカプセル化できます。

getIntArg :: IO Int
getIntArg = fmap (read . head) getArgs

モナドはファンクターであるため、これは機能します。または、 で同じことを行うこともできますliftM

そうすれば、main関数は次のようになります。

main = do
    n <- getIntArg
    disp n

disp他の回答で説明されているように、何らかのタイプの印刷機能を追加する場合。

于 2013-08-01T14:14:11.147 に答える
5

そこに追加した明示的な型を削除するだけで機能します。型推論を信じてください。:)print $ ...そこに追加するか、同様のものを追加して、新しいエラーを修正します。

何が起こるかというと、 の型がわかっているので、期待するtake引数の型もわかっています。dispですInt。したがって、適切なreadものが適用されます。

やることを減らして、もっとやりましょう。

于 2013-08-01T11:53:23.853 に答える