Data.Map和Data.IntMap中的查找函数当前返回包含在带有类型签名的Maybe中的值
lookup :: Ord k => k -> Map k a -> Maybe a
Run Code Online (Sandbox Code Playgroud)
它曾经有更普遍的类型
lookup :: (Monad m, Ord k) => k -> Map k a -> m a
Run Code Online (Sandbox Code Playgroud)
我意识到前者可能会减少额外类型规范的需要,但后者会使它更加通用,并允许在列表推导中使用查找.有没有办法模仿新版本的这种行为,还是我必须使用旧版本的库?
我是monad变形金刚的新手,很抱歉这个问题很简单.我有价值val :: MaybeT IO String和功能fn :: String -> IO [String].所以绑定后,我有val >>= liftM fn :: MaybeT IO (IO [String]).如何删除重复的IO monad并获取类型的结果MaybeT IO [String]?
在斯威夫特我能做到var?.prop.这导致nil,如果var是nil,否则将导致价值prop的财产var.
同样地,我可以做var >>= prop在Haskell,这给了我None是varIS None,否则它给我应用的价值prop里面的值var(裹Just).
Python中有相应的东西吗?
我正在尝试创建一个验证输入的函数String -> Maybe Int.我检查输入字符串是否是数字然后检查该数字是否在一个范围内.到目前为止我有
validateNumber :: String -> Maybe Int
validateNumber n = go $ (readMaybe::String -> Maybe Int) n
where
go (Just a) = inRange a
go Nothing = Nothing
inRange :: Int -> Maybe Int
inRange n
| n > 0 = Just n
| otherwise = Nothing
Run Code Online (Sandbox Code Playgroud)
这感觉就像糟糕的代码.怎么写呢?
此外,如果我试图循环一个函数,如果它返回Nothing,最好的方法是什么:
所以要循环这个main函数,我正在做:
case v of
Nothing -> main
Just x -> {do something}
Run Code Online (Sandbox Code Playgroud) 我对任何语言的答案感到满意,但我最终想要用Java解答.(Java 8+很好.不仅限于Java 8.我试图修复标签.)
如果我有两个Optional<Integer>值,我如何简洁地计算等价物a || b,意思是:a如果它被定义; 否则b,如果已定义; 否则empty()?
Optional<Integer> a = ...;
Optional<Integer> b = ...;
Optional<Integer> aOrB = a || b; // How to write this in Java 8+?
Run Code Online (Sandbox Code Playgroud)
我知道我可以写a.orElse(12),但如果默认的"值"也是Optional怎么办?
显然,在C#中,运营商??做了我想要的.
我很困惑为什么下面涉及的两个函数Nothing是不同的:
coalesce m1 m2 = if isNothing m1 then m2 else m1
coalesce' m1 m2 = if (m1 == Nothing) then m2 else m1
Run Code Online (Sandbox Code Playgroud)
第一个有类型:
?> :t coalesce
coalesce :: Maybe a -> Maybe a -> Maybe a
Run Code Online (Sandbox Code Playgroud)
正如所料.但第二个有:
?> :t coalesce'
coalesce' :: Eq a => Maybe a -> Maybe a -> Maybe a
Run Code Online (Sandbox Code Playgroud)
为什么使用(==Nothing)引入Eq a约束?
(GHC 8.2.2)
在 Elm 中转换List (Maybe a)为的好方法是Maybe (List a)什么?
逻辑很简单:
Just (List a)如果所有项目都是,则返回Just aNothing。Example 1:
input: [ Just 1, Just 2, Just 3 ]
output: Just [ 1, 2, 3 ]
Example 2:
input: [ Just 1, Nothing, Just 3 ]
output: Nothing
Run Code Online (Sandbox Code Playgroud)
使用某些内置功能可以轻松完成吗?
我想出的最好的看起来是这样的:
listOfMaybesToMaybeList : List (Maybe a) -> Maybe (List a)
listOfMaybesToMaybeList listOfMaybes =
List.foldl
(\maybeItem ->
\maybeResultList ->
case ( maybeItem, maybeResultList ) of
( Just item, Just …Run Code Online (Sandbox Code Playgroud) 我有一个表示谓词逻辑公式的标准数据类型.表示析出的自然演绎消除规则的函数可能如下所示:
d_el p q =
if p =: (Dis r s) && q =: (Neg r) then Just s else
if q =: (Dis r s) && p =: (Neg r) then Just s else
Nothing where r,s free
x =: y = (x =:= y) == success
Run Code Online (Sandbox Code Playgroud)
在统一失败时,该函数不返回Nothing,而是返回以下解决方案PACKS:
logic> d_el (Dis Bot Top) (Not Bot)
Result: Just Top
More Solutions? [Y(es)/n(o)/a(ll)] n
logic> d_el (Dis Bot Top) (Not Top)
No more solutions.
Run Code Online (Sandbox Code Playgroud)
我错过了什么,为什么在统一失败时不el评价Nothing?
我试图去做我们必须在Haskell,这是去是再明显Just [1]和Just [2]到Just [1, 2].但是我在网上找不到任何东西,因为我一直在寻找相关但无益的页面.那么,你是如何实现这一目标的?
好吧,我真正想做的是,我有一个数组,我想从中选择一个随机元素.显而易见的是从0和长度减1之间的随机数生成器获取一个整数,我已经工作了,然后应用Array.get,但返回一个Maybe a.(似乎还有一个包函数可以做同样的事情.)来自Haskell,我得到的类型意义是它保护我免受我的索引超出范围的情况,但我控制了索引而不是期待这种情况发生,所以我只想假设我得到了Just一些东西并且有点强行转换为a.在哈斯克尔fromJust,如果我感到冗长,那将是或者fromMaybe (error "some message").我应该怎么做榆树?
我在邮件列表上发现了一个似乎正在讨论这个问题的讨论,但它已经有一段时间了,我没有在标准库中看到我想要的功能,而讨论表明它会是这样.
以下是我发现的一些非常不满意的潜在解决方案:
aavailable,但我不喜欢这个,因为它给我的代码带来了完全错误的含义,并且可能会使调试变得更加困难.