标签: maybe

从包含"Just"的Maybe返回操作

我有一个返回类型为的函数 Maybe ([(Int,Int)],(Int,Int))

我想从另一个函数调用它并对数据执行操作.

但是,返回值包含在Just.第二种方法需要([(Int,Int)],(Int,Int)),因此不会接受Just ([(Int,Int)],(Int,Int)).

Just在应用第二种方法之前,有没有办法可以修剪?

我不完全了解使用JustMaybe-不过,我已被告知,对于第一种方法的返回类型必须是Maybe.

monads haskell maybe

15
推荐指数
2
解决办法
3598
查看次数

在IO中提取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?

io monads haskell maybe

15
推荐指数
3
解决办法
2607
查看次数

撰写部分功能

我有两个PartialFunctions fg.它们没有副作用,可以快速执行.将它们组成另一个部分函数的最佳方法是什么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)

monads scala partialfunction maybe

15
推荐指数
1
解决办法
3603
查看次数

为什么我们需要Monad而不是Monad

我正在玩Maybe和Either monad类型(链接,根据返回值应用条件函数,还返回链接函数失败的错误消息等).所以我觉得我们可以通过使用Either monad来实现相同和更多的事情.那么我的问题是那些之间的实际或概念上的区别?

monads haskell functional-programming either maybe

15
推荐指数
2
解决办法
1109
查看次数

如何过滤掉Elm Array中的"Nothing"值?

我想定义以下函数:

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)

maybe elm

12
推荐指数
2
解决办法
3823
查看次数

Haskell初学者

我不明白为什么我从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)

haskell maybe

11
推荐指数
2
解决办法
4253
查看次数

函数像catMaybes,但计算Nothing值

我有一个这样的列表:

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风格,因此故意不会显示任何研究工作!

haskell list maybe

11
推荐指数
2
解决办法
512
查看次数

为什么"什么都不归"都没有回归?

"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)

monads haskell maybe

11
推荐指数
1
解决办法
1045
查看次数

对于具有嵌套 Maybe 值的 Tree 数据类型, Traversable 实例应该是什么样子?

三天后我有一个 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)

tree haskell maybe traversable

11
推荐指数
2
解决办法
554
查看次数

Map.lookup的Maybe结果不是我的Monad Transformer堆栈的类型检查

我将通过以下论文:Monad Transformers Step by Step.在第2.1节"转换为一元样式",一个函数转换为返回ValueEval1单子.这部分功能对我来说没有意义:

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.

谢谢!

monads dictionary haskell monad-transformers maybe

10
推荐指数
1
解决办法
399
查看次数