是否有一种无条件的方法将条件检查转换为输入的Maybe类型?

sti*_*tes 6 haskell pointfree maybe

我只是在haskell中进行一些简单的练习,并且想知道是否有一种将if-then-else语句转换为Maybe类型的无点方法:Nothing如果条件为false则返回,Just如果条件为true则返回.

总之,给定一些:

maybeIf :: (a -> Bool) -> a -> Maybe a
maybeIf cond a = if cond a then Just a else Nothing
Run Code Online (Sandbox Code Playgroud)

是否有一个无点的实现a?我也一直在寻找一个更具体的版本a -> Maybe a,并且觉得某处可能有答案Control.Arrow.但是,由于Maybe是数据类型和if-else语句控制数据流,我不确定是否有一种干净的方法.

Dan*_*ner 7

阻碍制作该无点的主要原因是if/ then/ else.您可以定义if'组合器,也可以使用我定义和使用的通用版本:

ensure p x = x <$ guard (p x)
Run Code Online (Sandbox Code Playgroud)

标准工具提供连续的无点版本

ensure p = ap (<$) (guard . p)
ensure = ap (<$) . (guard .)
Run Code Online (Sandbox Code Playgroud)

虽然我真的不认为要么比有点版本更好.

  • `Data.Bool`有`bool`. (2认同)

Pet*_*all 7

您可以导入findData.Foldable,然后它是相当简单:

import Data.Foldable(find)

maybeIf cond = find cond . Just
Run Code Online (Sandbox Code Playgroud)

这个函数find并不复杂,所以你可以很容易地自己定义它Maybe,但是它实际上与你自己的实现没那么不同,maybeIf所以你可能不会获得太多,这取决于你想要这样做的原因.