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