簡體   English   中英

是否有標准功能“如果只是x,請執行此操作”?

[英]Is there a standard function for “do this if Just x”?

我有以下代碼:

doIf :: (a -> IO ()) -> Maybe a -> IO ()
doIf f x = case x of
  Just i -> f i
  Nothing -> return ()

main = do
  mapM_ (doIf print) [Just 3, Nothing, Just 4]

哪個輸出:

3
4

換句話說, Just值被打印,但Nothing值不會導致任何操作。 (並且不要中斷計算。)

在Haskell庫中是否有這樣的標准函數? 此外,這可以更通用嗎? 我嘗試用mb替換IO ()但是然后return ()不起作用。 你如何為任何monad一般寫return () (如果可能..)甚至可以將Maybe推廣到這里?

最后,我可以完全doIf功能嗎? 我可以有一個運算符<#>,除非Nothing

print <#> Just 3
print <#> Nothing

會輸出

3

但我不知道這是否可行。

看看這個功能:

maybe :: b -> (a -> b) -> Maybe a -> b

你幾乎把它寫在doIf除了固定的return ()

您的doIfData.Foldable.traverse_

你通常可以通過Hoogle找到這種東西,但此刻它似乎有點破碎。 我在系統上安裝的命令行版本將Data.Foldable.traverse_作為查詢的第一個結果(a -> IO ()) -> Maybe a -> IO ()


當然,您可以定義該運算符,它只是(<#>) = doIf (或(<#>) = Data.Foldable.traverse_ )。

你可以做的事情是這樣的:

main = do
  mapM_ print $ catMaybes [Just 3, Nothing, Just 4]

請參閱catMaybes的文檔。

(注意:未經測試的代碼)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM