当我试图DBObject通过插入批量加载一个列表时,我得到了no implicit view available.
collection.insert(listObjects) // listObjects is a List[DBObject]
[error]Test.scala:139: No implicit view available from List[com.mongodb.casba
h.Imports.DBObject] => com.mongodb.casbah.Imports.DBObject.
Run Code Online (Sandbox Code Playgroud)
这个错误是什么意思?我怎么解决?
参考:
def insert [A] (docs: List[A])(implicit arg0: (A) ? DBObject) : WriteResult
I'n看国家单子的put和get:
ghci> :t get
get :: MonadState s m => m s
ghci> :t runState
runState :: State s a -> s -> (a, s)
ghci> runState get [1,2,3]
([1,2,3],[1,2,3])
Run Code Online (Sandbox Code Playgroud)
在get's类型签名:MonadState s m => m s,有怎样[1,2,3]的类型MonadState s m?目前尚不清楚对我有什么的类型s和m是.
另外,您能否详细说明如何使用put?
ghci>:t put put :: MonadState sm => s - > m()
总的来说,似乎我不明白是什么MonadState s m.你能解释一下put和get例子吗?
看着你学习哈斯克尔的定义State Monad:
instance Monad (State s) where
return x = State $ \s -> (x,s)
(State h) >>= f = State $ \s -> let (a, newState) = h s
(State g) = f a
in g newState
Run Code Online (Sandbox Code Playgroud)
我不明白右下角的类型h s和类型g newState.
你能解释一下他们的类型和发生的事情吗?
看foldM:
foldM :: Monad m => (a -> b -> m a) -> a -> [b] -> m a
我试图创建一个foldM简单地将列表的每个元素附加[1,2,3]到自身的示例.
基于我最初的(错误的)理解foldM,我期望[[1], [2], [3]]作为以下的输出:
ghci> let f = (\xs x -> [x] : [xs])
Run Code Online (Sandbox Code Playgroud)
但是我错了:
ghci> foldM f [] [1,2,3]
[[3],[2],[3],[1],[3],[2],[3],[]]
Run Code Online (Sandbox Code Playgroud)
请解释一下这个例子中发生了什么.
当然数据类型并不精确,但这是(或多或少)Monoid Bool实现的方式?
import Data.Monoid
data Bool' = T | F deriving (Show)
instance Monoid (Bool') where
mempty = T
mappend T _ = T
mappend _ T = T
mappend _ _ = F
Run Code Online (Sandbox Code Playgroud)
如果是/不是,什么是做推理Bool的mappend一OR对AND?
Typeclassopedia提供以下练习:
按单位和(**)实现纯和(<*>),反之亦然.
这是Monoidal和MyApplicative:
class Functor f => Monoidal f where
u :: f () -- using `u` rather than `unit`
dotdot :: f a -> f b -> f (a,b) -- using instead of `(**)`
class Functor f => MyApplicative f where
p :: a -> f a -- using instead of `pure`
apply :: f (a -> b) -> f a -> f b -- using instead of `(<**>)`
Run Code Online (Sandbox Code Playgroud)
首先,让我展示Maybe类似的数据类型:
data Option …Run Code Online (Sandbox Code Playgroud) Typeclassopedia提出了这个练习:
为(( - >)e)实现Monad实例.
这是MyMonad班级.
class (MyMonad m) where
ret :: a -> m a
flatMap :: m a -> (a -> m b) -> m b
Run Code Online (Sandbox Code Playgroud)
然后,我开始尝试实现Monad实例((->) e).
instance (MyMonad (-> e)) where
ret x = ...
flatMap m f = ...
Run Code Online (Sandbox Code Playgroud)
但是,我没有直觉((->) e)意味着什么.
请帮助我理解它,并给我一个解决方案的暗示ret.
Scala提供了List#flatten一种从哪里List[Option[A]]开始List[A].
scala> val list = List(Some(10), None)
list: List[Option[Int]] = List(Some(10), None)
scala> list.flatten
res11: List[Int] = List(10)
Run Code Online (Sandbox Code Playgroud)
我试图在Haskell中实现它:
flatten :: [Maybe a] -> [a]
flatten xs = map g $ xs >>= f
f :: Maybe a -> [Maybe a]
f x = case x of Just _ -> [x]
Nothing -> []
-- partial function!
g :: Maybe a -> a
g (Just x) = x
Run Code Online (Sandbox Code Playgroud)
但是,我不喜欢这g是一个部分的,即非全部的功能.
是否有完整的方法来编写这样的 …
纵观国家单子的维基,我试图了解runState和put功能.
据我所知runState,它需要第一个参数State,它有一个"宇宙" s,和一个值,a.它需要宇宙的第二个参数.最后,它返回一个(a, s)地方a是新的价值,s是新的宇宙?
ghci> :t runState
runState :: State s a -> s -> (a, s)
Run Code Online (Sandbox Code Playgroud)
例:
ghci> let s = return "X" :: State Int String
ghci> runState s 100
("X",100)
Run Code Online (Sandbox Code Playgroud)
但是,我不明白put结果:
ghci> runState (put 5) 1
((),5)
Run Code Online (Sandbox Code Playgroud)
既然runState返回了(a, s),为什么是a类型()?
我对上面的尝试解释没有信心.请纠正我,并回答我的问题put.
鉴于:
scala> import shapeless.nat.
_0 _10 _12 _14 _16 _18 _2 _21 _3 _5 _7 _9 natOps
_1 _11 _13 _15 _17 _19 _20 _22 _4 _6 _8 apply toInt
scala> import shapeless.ops.nat._
import shapeless.ops.nat._
Run Code Online (Sandbox Code Playgroud)
> 3分钟后,以下代码未编译/运行.为什么?
scala> Sum[_22, _22]
Run Code Online (Sandbox Code Playgroud)
另外,看看上面的REPL自动完成,_44甚至存在于无形状中?