我已经开始尝试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) …在本教程中,我发现了以下代码段:
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) 我目前正在尝试学习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) 我希望得到最少两个可能的值,或者如果一个没有得到非任何一个,或者如果两个输入都没有则返回任何值.我可以编写一个简单的函数来执行此操作,但我怀疑有一种方法可以在不编写自定义函数的情况下执行此操作.对不起,如果这是一个小问题,但有比使用这个自定义功能更简单的方法吗?
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) 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实例?
在2015年,C#中可能有任何“官方”的monad吗?理想情况下,它将可以使用ala Scala的Option,Some和None类型。
C#似乎具有所需的所有内容,即co / contravariance和lambda。
我之所以这么问,是因为我最近开始在一家使用Unity的公司工作,并且遇到了很多延迟的初始化工作。为了避免NullPointerException,我想邀请他们进入monad世界。关于这一点有什么想法,还是我们应该简单地以其他方式处理?
我只是在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语句控制数据流,我不确定是否有一种干净的方法.
我刚刚发现自己写了这段代码:
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 a和c :: 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 <?> …
我有一个房间查询:
@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 …
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)