6

Haskellの実験を始めましたが、問題があります。qqqは、「Nothing」で呼び出された場合は1つの文字列を出力し、「Justsomething」で呼び出された場合は他の文字列を出力する関数です。

最初の試みはうまくいったようです:

qqq Nothing = print "There isn't anything to be printed."
qqq (Just x) = print "There is something to be printed." >> print x

main :: IO ()
main = qqq (Just 43)

だが:

  • 失敗させようとするmain = qqq (Nothing)と(「制約内のあいまいな型変数 `a0':(a0を表示)'qqq'の使用から生じる")
  • 失敗した場合に型署名を追加したい場合:
    • qqq :: Maybe x => x -> IO ()-> Type constructor 'Maybe' used as a class->でも、そうではありませんか?
    • qqq :: (Maybe x) -> IO ()。これで、署名自体が成功したように見えます。しかし、場合のようにmain = qqq (Just 43)その不思議な(Show a0)エラーで失敗し始めますmain = qqq (Nothing)

質問:

  1. でqqqを呼び出すことNothingが、で呼び出すのと非常に異なるのはなぜJust 43ですか?
  2. (Show a0)ですか?エラーメッセージでのみ言及されています。これを使用しようとすると、「スコープ内に表示されない」などの結果になります。
  3. このための正しい型署名とは何ですか?Haskellの型注釈を推測する方法は?次のようなものを期待しています:
f 0 = 2
f x = (f (x-1)) + 3

main = print get_type_as_string(f)
-- prints "Number -> Number"
4

1 に答える 1

9

タイプqqqは次のとおりです。

qqq :: Show a => Maybe a -> IO ()

つまりqqq、型の1つのパラメーターを受け取り、型クラスを実装する制約Maybe aを使用して、値なしでIOアクションを返します。何であるかを知るために、ghciで使用できます。aShowShow:i Show

Show型の値を文字列に変換できることを要求する型クラスです。値を出力したいqqqので制約があります(タイプがあります)。型クラスではなく、データ型です。型クラスの詳細については、こちらをご覧くださいprintprintShow a => a -> IO ()Maybe

.hsファイルに関数を入力し、ファイルにghci(ghci Myfile.hs)をロードしてから、型:t qqqを表示するために入力することにより、GHCに型シグネチャを推測させることができます。インタラクティブセッションで関数を定義することもできますlet qqq n = case n of { Nothing -> print "abc"; Just x -> print "def" >> print x }(関数の定義はghciの1行にある必要があるため、少し異なりますが、意味は同じです)。

mainが。を使用して呼び出す場合qqq、の具象型が数値型(ghciのデフォルトは整数)であるqqq (Just 43)ことは明らかであるため、の具象型は。ただし、、を使用したメインの呼び出しは何でもかまいません(あいまいです)。ghciはエラーを報告します。Maybe aqqqMaybe Integer -> IO ()qqqqqq Nothinga

于 2011-07-16T09:00:46.307 に答える