我已经开始尝试使用 Haskell 并且遇到了问题。qqq 是一个函数,如果用“Nothing”调用应该打印一个字符串,如果用“Just something”调用则打印其他东西。
第一次尝试似乎有效:
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"