Vi.*_*Vi. 6 haskell nothing maybe type-signature
我已经开始尝试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)
Run Code Online (Sandbox Code Playgroud)
但:
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)
.问题:
Nothing
是如此不同Just 43
?(Show a0)
?它仅在错误消息中提及.任何使用它的尝试都会导致类似"显示不在范围内"的内容.f 0 = 2
f x = (f (x-1)) + 3
main = print get_type_as_string(f)
-- prints "Number -> Number"
Run Code Online (Sandbox Code Playgroud)
类型qqq
是:
qqq :: Show a => Maybe a -> IO ()
Run Code Online (Sandbox Code Playgroud)
这意味着,qqq
采用类型的一个参数Maybe a
和没有值返回一个IO动作,与约束该a
实现Show
类型类.要了解它是什么Show
,您可以:i Show
在ghci中使用.
Show
是一个类型类,它要求可以将类型的值转换为字符串.qqq
有约束因为print
想要打印出值(print
有类型Show a => a -> IO ()
).Maybe
不是类型类,而是数据类型.您可以在此处阅读有关类型类的更多信息.
您可以让GHC通过在.hs文件中键入函数,然后使用ghci(ghci Myfile.hs
)加载文件,然后键入:t qqq
以显示类型来推断类型签名.您还可以在交互式会话中定义函数let qqq n = case n of { Nothing -> print "abc"; Just x -> print "def" >> print x }
(它看起来有点不同,因为函数定义必须在ghci中的一行上,但含义相同).
当主调用qqq
时qqq (Just 43)
,很明显具体类型Maybe a
是数字类型(ghci默认为Integer),qqq
具体类型为Maybe Integer -> IO ()
.然而,主通话qqq
使用qqq Nothing
,a
可以是任何东西(它是含糊不清)和ghci的报告错误.