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#(),而且它很粗糙。在哈斯凯尔有没有一种干净的方法,如果没有

我想知道如何定义一个操作符/如果Haskell中已经存在一个操作符,可以选择第一个
可能
类型,它不是
,如果它们都是无,它会返回一些默认值。基本上是这样的:

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