Haskell和Yesod新手在这里.我一直在尝试从Yesod书中的Persistent章节(http://www.yesodweb.com/book/persistent)中跟踪与Yesod示例的集成.似乎Sqlite编译并运行良好.但是,我正在尝试使用MongDB,并且很难让事情发挥作用.特别:
在sqlite的示例中:
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persist|
Yesod书中说"Mongo代码将mongoSettings改为使用".但我无法在任何模块中找到它,并且代码无法编译.所以相反,我不得不使用它而不是mongoSettings:
MkPersistSettings { mpsBackend = ConT ''Action }
我必须导入Language.Haskell.TH.Syntax才能让它进行编译,我假设它应该对用户隐藏,所以我当然不是正确的.
另外,我发现在Mongo的Persistent测试中没有"share"和"migrate"部分.我实际上不确定为什么,我猜它是因为MongoDB是Schema-less而不需要迁移?
SqlPersist
我认为MongoPersist是SqlPersist的对应物,我猜它几乎是 - 我MongoPersist在Persistent的测试目录中的init.hs中找到了一个实例.但它被评论出来了,所以我觉得它已经过时了?否则,就我所知,它无论如何都没有定义.所以我不知道如何转换以下行(Yesod书的第115页,或接近http://www.yesodweb.com/book/persistent的末尾)来为MongoDB工作:
instance YesodPersist PersistTest where
type YesodPersistBackend PersistTest = SqlPersist
runDB action = do
PersistTest pool <- getYesod
runSqlPool action pool
Run Code Online (Sandbox Code Playgroud)使用withMongoDBConn
所以对于sqlite,代码是(上面网页的第一个例子):
main :: IO ()
main = withSqliteConn ":memory:" $ runSqlConn $ do
runMigration migrateAll
johnId <- insert $ Person "John Doe" $ Just 35
... and …Run Code Online (Sandbox Code Playgroud)这个问题可能看起来像以前被问过很多次,但我不确定我是否正确地汇总了答案.所以这里.
Apple(WWDC 2012 Session 214)将ObjectID描述为上下文安全的线程安全的.所以我花了一些时间来转换我的代码以利用它.但是,它看起来并不像上下文一样安全,因为这里 讨论的核心数据:子上下文是否会为新插入的对象获取永久的objectID?在其他地方,存在称为永久ID的东西.
关于这个永久性ID业务,我查看了NSManagedObjectContext.h:
/* Converts the object IDs of the specified objects to permanent IDs. This implementation
will convert the object ID of each managed object in the specified array to a permanent
ID. Any object in the target array with a permanent ID will be ignored; additionally,
any managed object in the array not already assigned to a store will be assigned, based on
the same rules Core Data uses for assignment …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用hmatrix,而且hmatrix-gsl-stats.但我得到了绝对奇怪的结果.任何人都能重现我所看到的吗?
import Numeric.LinearAlgebra
import Numeric.GSL.Fitting.Linear
main :: IO ()
main = do
let y = fromList [1,2,3,4,5]
let x = trans $ fromLists [[1,2,3,4,5], [1,1,1,1,1]]
let x3 = fromLists [[1,1], [2,1], [3,1], [4,1], [5,1]]
print $ x == x3
print $ multifit x y
print $ multifit x3 y
Run Code Online (Sandbox Code Playgroud)
所以我只是编译它并运行它,我得到:
True
(fromList [0.6121951219512196,0.39756097560975645],(2><2)
[ 0.5100317271465397, -0.46568114217727535
, -0.46568114217727535, 0.82048582193139 ],27.27560975609756)
(fromList [1.0000000000000002,-8.881784197001252e-16],(2><2)
[ 2.1364982849735737e-32, -6.40949485492072e-32
, -6.40949485492072e-32, 2.350148113470931e-31 ],6.409494854920721e-31)
Run Code Online (Sandbox Code Playgroud)
我错过了一些完全明显的东西吗
所以>>= :: m a -> (a -> m b) -> m b和>> :: m a -> m b -> m b.
而<* :: f a -> f b -> f a.
但我想要做的事情m a -> (a -> m b) -> m a,即实际上丢弃计算结果并保留原始.在我的例子中,这个计算结果只是一个返回的IO操作,()所以我只需要传递原始值.
有这样的功能吗?如果没有,我该如何撰写?没想成功.谢谢!
haskell ×3
core-data ×1
gsl ×1
ios ×1
monads ×1
mongodb ×1
objectid ×1
objective-c ×1
persistent ×1
yesod ×1