Haskell 也许是凝聚操作员
我想知道如何定义一个操作符/如果Haskell中已经存在一个操作符,可以选择第一个Haskell 也许是凝聚操作员,haskell,null,maybe,null-coalescing-operator,Haskell,Null,Maybe,Null Coalescing Operator,我想知道如何定义一个操作符/如果Haskell中已经存在一个操作符,可以选择第一个可能类型,它不是无,如果它们都是无,它会返回一些默认值。基本上是这样的: let x = a ?? b ?? c ?? 1 其中,(?)是运算符,a、b、c都是可能的类型。如果a、b、c都是Nothing,我希望此代码返回第一个值,即Just或1 我基本上希望复制与在C或其他语言中找到的空合并操作符相同的功能 这个问题说明了如何在计算机中实现这一点 F#(),而且它很粗糙。在哈斯凯尔有没有一种干净的方法,如果没有
可能类型,它不是无
,如果它们都是无,它会返回一些默认值。基本上是这样的:
let x = a ?? b ?? c ?? 1
其中,(?)
是运算符,a、b、c
都是可能的类型。如果a、b、c
都是Nothing
,我希望此代码返回第一个值,即Just
或1
我基本上希望复制与在C
或其他语言中找到的空合并操作符相同的功能
这个问题说明了如何在计算机中实现这一点
F#(),而且它很粗糙。在哈斯凯尔有没有一种干净的方法,如果没有,最接近的方法是什么?你介意用不同的方式写吗
safeHead [] d = d
safeHead (h:_) _ = h
然后
我会做你想做的
如果你想这样做,这是可行的,但需要两个操作符
a@(Just _) ?? _ = a
_ ?? b = b
(Just e) ?: _ = e
_ ?: d = d
定义所需的两个运算符,它们可以工作:
Prelude> let a = Nothing
Prelude> let b = Nothing
Prelude> let c = Just 3
Prelude> a ?? b ?? c ?: 10
3
Prelude> a ?? b ?? Nothing ?: 10
10
Haskeller's通常用于这类事情。假设a,b,c::Maybe Int
,那么就有x::Maybe Int
let x = a <|> b <|> c <|> Just 1
然后,你会得到你所期望的行为。假设a,b,c::可能是Int
,则您有x::Int
:
let x = a ?? b ?? c ?? 1
仅出于一些实践目的,此作业还可以用Monoid
类类型First
表示,这是一个可能返回最左侧非空值的Monoid
import Data.Monoid
import Data.Maybe (fromJust)
infixr 3 ??
(??) :: Maybe a -> a -> a
x ?? y = fromJust . getFirst $ First x <> First (Just y)
*Main> Nothing ?? Nothing ?? 1
1
*Main> Nothing ?? Just 3 ?? 1
3
*Main> Just 7 ?? Just 3 ?? 1
7
导入数据.Monoid
导入数据。可能(fromJust)
infixr 3??
(?)::可能是a->a->a
x??y=从刚开始。getFirst$First x First(仅y)
*Main>什么都没有??没有什么??1.
1.
*Main>什么都没有??只有3个??1.
3.
*Main>仅7??只有3个??1.
7.
这是可行的,但我想你是对的,我应该清楚地表明,我希望按照上面指定的方式具体完成。我将对其进行编辑,并添加我在F#中看到的一个示例。@m0meni我不编写F#,对不起。但我可以向您展示如何使用haskell中的运算符(但有两个运算符)。您的答案更好。如果您有一个方便的实例Num a=>Num(可能是a)
,您可以将1
与
结合使用。我们还可以使用数据中的asum
,使用
组合可能的列表。是找到这种东西的好工具。
let x = a ?? b ?? c ?? 1
import Data.Monoid
import Data.Maybe (fromJust)
infixr 3 ??
(??) :: Maybe a -> a -> a
x ?? y = fromJust . getFirst $ First x <> First (Just y)
*Main> Nothing ?? Nothing ?? 1
1
*Main> Nothing ?? Just 3 ?? 1
3
*Main> Just 7 ?? Just 3 ?? 1
7