我有一个返回类型为的函数 Maybe ([(Int,Int)],(Int,Int))
我想从另一个函数调用它并对数据执行操作.
但是,返回值包含在Just.第二种方法需要([(Int,Int)],(Int,Int)),因此不会接受Just ([(Int,Int)],(Int,Int)).
Just在应用第二种方法之前,有没有办法可以修剪?
我不完全了解使用Just中Maybe-不过,我已被告知,对于第一种方法的返回类型必须是Maybe.
鉴于以下内容:
> (liftM2 fromMaybe) (ioError $ userError "OOPS") (return $ Just "ok")
Run Code Online (Sandbox Code Playgroud)
ghci给了我
*** Exception: user error (OOPS)
Run Code Online (Sandbox Code Playgroud)
当然,来自Maybe的工作正常:
> (liftM2 fromMaybe) (return $ "not me") (return $ Just "ok")
"ok"
Run Code Online (Sandbox Code Playgroud)
但似乎IO操作正在执行然后被丢弃:
> (liftM2 fromMaybe) (putStrLn "computing.." >> "discarded") (return $ Just "ok")
computing..
"ok"
Run Code Online (Sandbox Code Playgroud)
为什么会这样?有没有什么方法可以让IO Monad更加懒散?
具体来说,考虑value :: IO (Maybe a)到(简洁,简洁)的说法
result <- (liftM2 fromMaybe) err value
Run Code Online (Sandbox Code Playgroud)
并解压缩结果或相应地抛出IOError?
我有两个PartialFunctions f和g.它们没有副作用,可以快速执行.将它们组成另一个部分函数的最佳方法是什么h,
h.isDefinedAt(x)iff f.isDefinedAt(x) && g.isDefinedAt(f(x))?
如果h函数返回Option而不是部分函数,也可以.
我很失望,f andThen g没有做我想做的事:
scala> val f = Map("a"->1, "b"->2)
f: scala.collection.immutable.Map[String,Int] = Map(a -> 1, b -> 2)
scala> val g = Map(1->'c', 3->'d')
g: scala.collection.immutable.Map[Int,Char] = Map(1 -> c, 3 -> d)
scala> (f andThen g).isDefinedAt("b")
res3: Boolean = true
scala> (f andThen g).lift("b")
java.util.NoSuchElementException: key not found: 2
at scala.collection.MapLike$class.default(MapLike.scala:228)
Run Code Online (Sandbox Code Playgroud) 我正在玩Maybe和Either monad类型(链接,根据返回值应用条件函数,还返回链接函数失败的错误消息等).所以我觉得我们可以通过使用Either monad来实现相同和更多的事情.那么我的问题是那些之间的实际或概念上的区别?
我想定义以下函数:
compactAndConvertToList : Array (Maybe String) -> List String
Run Code Online (Sandbox Code Playgroud)
此函数应删除Nothing给定数组中的所有外观,并将其转换为List.
我想出了下面的解决方案,但感觉有点脏.
有没有更好的方法来实现这一目标?
import Graphics.Element exposing (..)
import Array
model : Array.Array (Maybe String)
model = Array.fromList [ Just "Hello", Just "Stack", Nothing, Just "Overflow" ]
compactAndConvertToList : Array.Array (Maybe String) -> List String
compactAndConvertToList maybeStrings =
maybeStrings
|> Array.filter (\x -> x /= Nothing)
|> Array.map (Maybe.withDefault "")
|> Array.toList
main =
model
|> compactAndConvertToList
|> show
Run Code Online (Sandbox Code Playgroud) 我不明白为什么我从GHCi得到以下回复.不是Maybe构造函数吗?
Prelude> :t Maybe
<interactive>:1:1: Not in scope: data constructor `Maybe'
Prelude> let e = Maybe 5
<interactive>:1:9: Not in scope: data constructor `Maybe'
Run Code Online (Sandbox Code Playgroud) 我有一个这样的列表:
let foo = [Just 1, Just 2, Nothing, Just 3, Nothing, Nothing]
Run Code Online (Sandbox Code Playgroud)
通过使用catMaybes我只能提取Just构造的值:
catMaybes foo -- [1,2,3]
Run Code Online (Sandbox Code Playgroud)
我现在正在寻找一个函数,它不仅可以生成一个Justs 列表,还可以Nothing通过遍历它来获得有限列表的s 计数.它应该有这样的签名:
catMaybesCount :: [Maybe a] -> ([a], Int)
Run Code Online (Sandbox Code Playgroud)
注意:此问题已回答Q&A风格,因此故意不会显示任何研究工作!
"return a"应该包含在一些Monad的上下文中:
*Main> :i return
class Applicative m => Monad (m :: * -> *) where
...
return :: a -> m a
...
-- Defined in ‘GHC.Base’
Run Code Online (Sandbox Code Playgroud)
如果我问GHCI"返回什么"的类型是什么,它符合:
*Main> :t return Nothing
return Nothing :: Monad m => m (Maybe a)
Run Code Online (Sandbox Code Playgroud)
但是,如果我评估它,我看不到外蒙纳德,只有内在的可能:
*Main> return Nothing
Nothing
Run Code Online (Sandbox Code Playgroud) 三天后我有一个 Haskell 考试,所以我想我应该练习一下并提取过去的考试,其中一个具有以下 Tree 数据类型:
data Tree a = Leaf1 a | Leaf2 a a | Node (Tree a) (Maybe (Tree a)) deriving (Eq, Ord, Show)
Run Code Online (Sandbox Code Playgroud)
起初看起来并不那么具有挑战性,但后来我意识到我必须为这棵树编写一个 Traversable 实例。处理树叶很容易:
instance Traversable Tree where
traverse f (Leaf1 a) = Leaf1 <$> f a
traverse f (Leaf2 a b) = Leaf2 <$> f a <*> f b
Run Code Online (Sandbox Code Playgroud)
但是,我开始遇到 Node.js 的问题。
traverse f (Node t Nothing) = Node <$> traverse f t <*> Nothing
traverse f (Node l (Just r)) = Node <$> …Run Code Online (Sandbox Code Playgroud) 我将通过以下论文:Monad Transformers Step by Step.在第2.1节"转换为一元样式",一个函数转换为返回Value在Eval1单子.这部分功能对我来说没有意义:
eval1 env (Var n) = Map.lookup n env
Run Code Online (Sandbox Code Playgroud)
然而,结果将是Maybe Value函数的类型签名是:
eval1 :: Env ? Exp ? Eval1 Value
Run Code Online (Sandbox Code Playgroud)
该函数无法键入检查,错误对我来说似乎很明显.然而,作者明确指出这将有效:
... Var的情况不再需要一个fromJust调用了:原因是Map.lookup被定义为只需调用monad的失败函数就可以在任何monad中工作 - 这非常适合我们的monadic公式.
Map.lookup的签名看起来不像是用于任何monad:
lookup :: Ord k => k -> Map k a -> Maybe a
Run Code Online (Sandbox Code Playgroud)
这篇论文是否已过时或者我遗失了什么?如果论文实际上已经过时,为什么lookup改为只能使用Maybe.
谢谢!