所以这是我的计划。我想自己实现一个最大的函数来进行赋值。问题是,对我来说,在它前面打上“Just”这个数字似乎很奇怪......我怎么解决这个问题只打印一个数字?
mymax :: Ord a=>[a]->Maybe a
mymax [] = Nothing
mymax [x] = Just x
mymax (x:y:xs) = if x < y then mymax(y:xs) else mymax(x:xs)
答案 0 :(得分:8)
Show
的{{1}}个实例将Maybe
放在那里。如果您不想要它,简单的解决方案是不使用Just
show
在这里,我们只需将myPrint :: Show a => Maybe a -> IO ()
myPrint (Just x) = print x
myPrint n = print n
解包,然后再将其转移到Just
。
另一种选择是失去print
。您可以使用Maybe
maybe
此值为maybe (putStrLn "Nothing") print m
printMay = maybe (putStrLn "Nothing") print
,如果m :: Maybe a
将Just x
投掷到x
。否则它只返回print
。
答案 1 :(得分:3)
你在这里有很多选择!以下解决方案正是您所要求的,不多也不少:*
printMaybe :: Show a => Maybe a -> IO ()
printMaybe m = when (isJust m) $
print (fromJust m)
如果它是Just
值,这将打印参数可能值,否则什么都不做。但是,在大多数情况下,它并不是最好的解决方案。只要您看到fromJust
,就应该将其视为红旗。在这种情况下,问题是Nothing
案件根本没有处理。当列表为空时,我们可能想要通知用户或至少做某事。然后,也许我们没有,然后这个解决方案没问题。
另一种情况是,如果您希望在值为Nothing
时打印某些内容,则可以使用maybe
函数。
printMaybe m = maybe (putStrLn "List was empty!") print m
这将打印“列表为空!”如果m
包含Nothing
,则会打印m
。这当然等同于
printMaybe = maybe (putStrLn "List was empty!") print
您也可以手动使用模式匹配来实现这一点,如下所示:
printMaybe m = case m of
Nothing -> putStrLn "List was empty!"
Just x -> print x
这是等效的,但稍微多一些代码。同样,你可以明确地做
printMaybe m = case m of
Nothing -> return ()
Just x -> print x
如果你希望函数在得到Nothing
值时根本不做任何事情,就像我的答案中的第一个函数一样。
*这可以通过使用函数的应用实例更加整洁地编写,如下所示:
printMaybe = liftA2
when isJust $ print . fromJust
这完全符合它的内容。 “ 论点 ,打印 来自 <强>只需即可。“
答案 2 :(得分:2)
您可以使用fromJust
:: Maybe a -> a
功能。例如,这会将Just 4
转换为4
。但是要小心,如果你打电话给fromJust Nothing
,它会抛出一个错误。
要避免错误,请使用fromMaybe
,如果您将Nothing
值传递给函数,则会使用默认值。