Haskell:使用Maybe但打印实际数字而不是“Just ...”

时间:2013-09-18 04:50:16

标签: haskell max

所以这是我的计划。我想自己实现一个最大的函数来进行赋值。问题是,对我来说,在它前面打上“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)

3 个答案:

答案 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 aJust 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值传递给函数,则会使用默认值。