module Main where
qsort :: Ord a => [a] -> [a]
qsort [] = []
qsort (x : xs) = qsort smaller ++ [x] ++ qsort larger
where
smaller = [a | a <- xs , a <= x]
larger = [a | a <- xs , a > x]
main = do qsort [1,3,2]
我收到以下错误
Couldn't match expected type `IO t0' with actual type `[a0]'
In the expression: main
When checking the type of the function `main'
我究竟做错了什么?
一个内的所有函数do
块必须与返回的一元值匹配。你可以写
main = do
print (qsort [1, 3, 2])
Because print
返回一个IO
价值。同样,如果您使用的是Maybe
monad,你必须做类似的事情
-- lookup :: Eq k => k -> [(k, v)] -> Maybe v
-- listToMaybe :: [a] -> Maybe a
firstElementOf :: Eq q => k -> [(k, [v])] -> Maybe v
firstElementOf key assocMap = do
v <- lookup key assocMap
first <- listToMaybe v
return first
这有效是因为lookup
and listToMaybe
两者都返回一个Maybe
,这是整体的返回值do
由类型签名指定的块firstElementOf
.
看看类型qsort
,它只返回[a]
, not IO something
,所以不能直接在里面使用main
的阻止。您还可以使用以下命令将其返回值分配给名称let
:
main = do
let result = qsort [1, 3, 2]
print result
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)