标签: maybe

使用Haskell的"Maybe",输入声明[beginner's question]

我已经开始尝试Haskell并遇到问题.qqq是一个函数,如果使用"Nothing"调用则应打印一个字符串,如果使用"Just something"调用则打印其他内容.

第一次尝试似乎工作:

qqq Nothing = print "There isn't anything to be printed."
qqq (Just x) = print "There is something to be printed." >> print x

main :: IO ()
main = qqq (Just 43)
Run Code Online (Sandbox Code Playgroud)

但:

  • 当我试图main = qqq (Nothing)让它失败时(约束中的"模糊类型变量'a0':(显示a0)因使用'qqq'而产生"")
  • 如果我想在失败时添加类型签名:
    • qqq :: Maybe x => x -> IO ()- > Type constructor 'Maybe' used as a class- >但不是吗?
    • qqq :: (Maybe x) -> IO ().现在签名本身看起来很成功.但是,如果遇到main = qqq (Just 43)这种神秘的(Show a0) …

haskell nothing maybe type-signature

6
推荐指数
1
解决办法
914
查看次数

也许monad绑定函数优先级

教程中,我发现了以下代码段:

deposit :: (Num a) => a -> a -> Maybe a
deposit value account = Just (account + value)

withdraw :: (Num a,Ord a) => a -> a -> Maybe a
withdraw value account = if (account < value) 
                         then Nothing 
                         else Just (account - value)

eligible :: (Num a, Ord a) => a -> Maybe Bool
eligible account =
  deposit 100 account >>=
  withdraw 200 >>=
  deposit 100  >>=
  withdraw 300 >>=
  deposit 1000 >>
  return …
Run Code Online (Sandbox Code Playgroud)

monads haskell maybe

6
推荐指数
1
解决办法
430
查看次数

将值乘以两个"Maybe"monad?

我目前正在尝试学习Haskell,并遇到了一个关于Maybemonad 的奇怪问题,我似乎无法弄明白.

作为一个实验,我正在尝试取一个字符串,将每个字母转换为任意数字,然后将它们相乘或组合在一起.这是我到目前为止所拥有的:

lookupTable :: [(Char, Int)]
lookupTable = [('A', 1), ('B', 4), ('C', -6)]

strToInts :: String -> [Maybe Int]
strToInts = map lookupChar
    where 
        lookupChar :: Char -> Maybe Int
        lookupChar c = lookup c lookupTable

-- Currently fails
test :: (Num n, Ord n) => [Maybe n] -> [Maybe n]
test seq = [ x * y | (x, y) <- zip seq $ tail seq, x < y ]

main :: IO ()
main …
Run Code Online (Sandbox Code Playgroud)

haskell maybe

6
推荐指数
2
解决办法
2242
查看次数

至少两个Maybes

我希望得到最少两个可能的值,或者如果一个没有得到非任何一个,或者如果两个输入都没有则返回任何值.我可以编写一个简单的函数来执行此操作,但我怀疑有一种方法可以在不编写自定义函数的情况下执行此操作.对不起,如果这是一个小问题,但有比使用这个自定义功能更简单的方法吗?

minMaybe :: Ord a => Maybe a -> Maybe a -> Maybe a
minMaybe Nothing b = b
minMaybe a Nothing = a
minMaybe (Just a) (Just b) = Just $ min a b
Run Code Online (Sandbox Code Playgroud)

haskell maybe

6
推荐指数
2
解决办法
861
查看次数

为什么Either派生出Show但是Maybe不会?

两者的文档EitherMaybe表明他们有实例Show.

Either被定义为派生Show,简单地说:

data  Either a b  =  Left a | Right b
  deriving (Eq, Ord, Read, Show, Typeable)
Run Code Online (Sandbox Code Playgroud)

然而,Maybe不是:

data  Maybe a  =  Nothing | Just a
  deriving (Eq, Ord)
Run Code Online (Sandbox Code Playgroud)

既然它们是一部分base并且如此相似,为什么不Maybe直接导出Show

另一个问题也可能是,它在哪里得到它的Show实例?

haskell show either maybe deriving

6
推荐指数
1
解决办法
246
查看次数

在C#中可能/选项单子

在2015年,C#中可能有任何“官方”的monad吗?理想情况下,它将可以使用ala Scala的Option,Some和None类型。

C#似乎具有所需的所有内容,即co / contravariance和lambda。

我之所以这么问,是因为我最近开始在一家使用Unity的公司工作,并且遇到了很多延迟的初始化工作。为了避免NullPointerException,我想邀请他们进入monad世界。关于这一点有什么想法,还是我们应该简单地以其他方式处理?

c# monads option maybe

6
推荐指数
1
解决办法
2682
查看次数

是否有一种无条件的方法将条件检查转换为输入的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语句控制数据流,我不确定是否有一种干净的方法.

haskell pointfree maybe

6
推荐指数
2
解决办法
583
查看次数

在Haskell中,是否有<?> - 运算符的抽象?

我刚刚发现自己写了这段代码:

import Control.Applicative ((<|>))

x = mA <|> mB <?> c

(<?>) :: Maybe a -> a -> a
Just x  <?> _ = x
Nothing <?> y = y
Run Code Online (Sandbox Code Playgroud)

在哪里mA :: Maybe a,mB :: Maybe ac :: a,和x :: a.基本上,代码说:选择第一个不是empty默认的替代方案c.你可以把它称为"逆向也许monad",其中的类比<?>将是pure.

同样,我本来可以写的

Just x = mA <|> mB <|> pure c,
Run Code Online (Sandbox Code Playgroud)

但我对无可辩驳的模式感到不舒服.或者,当然,

x = fromMaybe c (mA <|> mB)
Run Code Online (Sandbox Code Playgroud)

因为fromMaybe === flip <?> …

haskell applicative maybe

6
推荐指数
1
解决办法
157
查看次数

当返回空结果时,房间查询返回 Maybe&lt;List&gt; 使应用程序崩溃

我有一个房间查询:

@Query("SELECT * FROM classes WHERE _id IN(:values) ORDER BY date DESC")
fun getClassesByIds(values: List<Int>): Maybe<List<YClass>>
Run Code Online (Sandbox Code Playgroud)
compositeDisposable.add(viewModel.getClassesById(classesTaken)
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .doOnSuccess { list ->
                        list.forEach {

                            setupInfo(student)
                        }
                    }
                    .doOnError { it.printStackTrace() }
                    .subscribe())
Run Code Online (Sandbox Code Playgroud)

当我从活动导航回来时,结果为空应用程序崩溃。实际上崩溃是在执行另一个查询时发生的。即使没有任何问题,第二个查询也会出错。

引起:android.arch.persistence.room.EmptyResultSetException:查询返回空结果集:SELECT * FROM classes WHERE _id IN() ORDER BY date DESC

03-06 00:07:53.476 31132-31199/? I/InputDispatcher: 窗口 'Window{135734f u0 com.labfoodandfriends.nikitagudkovs.jlog/com.labfoodandfriends.nikitagudkovs.jlog.activity.student_and_teacher.StudentOverview}' 花了 4249.1ms 处理最后一个输入事件:KeyEvent(deviceId) =0x00000101,动作=1,标志=0x00000048,keyCode=4,scanCode=0,metaState=0x00000000,repeatCount=0),policyFlags=0x6b000002 03-06 00:07:53.612/1373.612-137d I/zygote64:编译器分配了 6MB 来编译 void android.view.ViewRootImpl.performTraversals() 03-06 00:07:53.661 13731-13736/com.labfoodandfriends.nikitagudkovs.jlog I/zygote64:代码=全码缓存集合502KB, data=339KB 03-06 00:07:53.662 13731-13736/com.labfoodandfriends.nikitagudkovs.jlog I/zygote64:代码缓存收集后,
在 io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:704) 03-06 00:07:55.875 13731-13731/com.labfoodandfriends.nikitagudkovs.jlog W/
System.reerr …

sql android maybe rx-java2 android-room

6
推荐指数
2
解决办法
5508
查看次数

为什么Maybe的Semigroup实例偏向于Just而Monoid使用Nothing作为其空元素?

Maybe表示可能由于错误而不会产生结果的计算.因此,这种计算必须短路.

现在Maybe的Semigroup/Monoid实例似乎打破了这种语义,因为前者偏向于Just,后者将错误情况Nothing视为空元素:

Just "foo" <> Nothing -- Just "foo"
Nothing <> Just "bar" -- Just "bar"
Just "foo" <> Just "bar" -- Just "foobar"
Nothing <> Nothing -- Nothing
Run Code Online (Sandbox Code Playgroud)

我期望Nothing前两个案例.

这是替代实现(希望它是正确/合法的):

instance Semigroup a => Semigroup (Maybe a) where
    Nothing <> _       = Nothing
    _       <> Nothing = Nothing
    Just a  <> Just b  = Just (a <> b)

instance Monoid a => Monoid (Maybe a) where
  mempty = Just mempty …
Run Code Online (Sandbox Code Playgroud)

haskell monoids maybe semigroup

6
推荐指数
1
解决办法
242
查看次数