假设我有一个包含以下数据的数组:
@array[0] = "hello this is a text"
@array[1] = "this is a cat"
@array[2] = "this is a dog"
@array[3] = "this is a person"
@array[4] = "this is a computer"
@array[5] = "this is a code"
@array[6] = "this is an array"
@array[7] = "this is an element"
@array[8] = "this is a number"
Run Code Online (Sandbox Code Playgroud)
我希望有一个循环,它遍历所有的数组元素,并发现如果元素确实有狗,任何元素中是否有值"dog",然后删除元素.结果将是:
@array[0] = "hello this is a text"
@array[1] = "this is a cat"
@array[2] = "this is a person"
@array[3] = "this is …Run Code Online (Sandbox Code Playgroud) 我有一个m支持以下操作的 monad:
someName :: (t1 -> m u1) -> (t2 -> m u2) -> ((t1, t2) -> m (u1, u2))
Run Code Online (Sandbox Code Playgroud)
用更像英语的方式来说:给定一个可用于将inbind转换为另一个映射的映射,用于另一对类型的映射,返回这两种类型对的映射。m t1m u1
这个概念有名字吗?它对所有 monad 都有明确定义吗?只有一些?没有,我的事实对于我正在研究的事实来说是错误的吗?
这让人想起traverse对Traversables 的操作,只不过涉及两个映射。另外,traverse对于 2 元组似乎仅将映射应用于第二个元素:
ghci> f a = Just (a + 1)
ghci> traverse f (0, 1)
Just (0,2)
ghci> traverse f ("Hello", 1)
Just ("Hello",2)
Run Code Online (Sandbox Code Playgroud) bisequence我在“心理类型检查”Haskell 中和之间的关系时遇到了一些麻烦bitraverse。根据文档,这是他们的签名:
bisequence :: (Bitraversable t, Applicative f) => t (f a) (f b) -> f (t a b)\nbitraverse :: Applicative f => (a -> f c) -> (b -> f d) -> t a b -> f (t c d)\nRun Code Online (Sandbox Code Playgroud)\n另外根据文档,以下关系成立:
\nbisequence \xe2\x89\xa1 bitraverse id id\nRun Code Online (Sandbox Code Playgroud)\n但这种关系对我来说没有意义:
\n的签名id是a -> a,那么它如何被接受为bitraverse需要eg的第一个或第二个参数呢a -> f c?
即使我们克服了第一点, 的类型bitraverse id id也应该是Bitraversable …
假设我有一个Futuremonad,soFuture a代表一个a可能可用或尚不可用的。然后sequenceA自动给我语义“等待所有这些 future 准备好并给我所有它们的值”:
sequenceA :: [Future a] -> Future [a]
Run Code Online (Sandbox Code Playgroud)
这类似于逻辑“与”,因为直到所有输入都准备好后它才准备好。进一步深化这个比喻,我们可以定义逻辑或:“用第一个准备好的输入的值来准备好”。
firstReady: [Future a] -> Future a
Run Code Online (Sandbox Code Playgroud)
这个隐喻是否可以推广到其他单子/可遍历对象?此操作有标准名称吗?