如何从from
语句中生成esqueleto以生成SQL字符串?
文档toRawSql
说"你可能只是打开持久性的查询记录".我尝试了所有可能的形式MonadLogger
,但我从未打印过任何SQL.同样的文档也说"手动使用这个功能......可能但很乏味".但是,不会QueryType
导出该类型的构造函数,也不会导出返回该类型值的任何函数.我设法通过注意这QueryType
是一个newtype
和使用来解决这个问题unsafeCoerce
!
我也被迫提供Connection
(我通过SQLite获得),即使不需要连接到数据库来生成SQL.
这就是我所拥有的.肯定有更好的办法.
withSqliteConn ":memory:" $
\conn -> return $ toRawSql SELECT
(unsafeCoerce ((const mempty)
:: a -> Text.Lazy.Builder.Builder))
(conn, initialIdentState) myFromStatement)
Run Code Online (Sandbox Code Playgroud)
http://hackage.haskell.org/package/esqueleto-1.3.4.2/docs/Database-Esqueleto-Internal-Sql.html
我想在Haskell中表示以下形状的"树":
/\
/\/\
/\/\/\
/\/\/\/\
` ` ` ` `
Run Code Online (Sandbox Code Playgroud)
/和\是分支和`叶子.您可以看到从左侧路径开始的任何节点开始,然后右侧将您带到与右侧路径相同的节点,然后是左侧.您应该能够标记叶子,在每个节点应用两个后代的函数,并在O(n ^ 2)时间内将此信息传播到根.我天真的努力给了我一个指数的运行时间.任何提示?
假设我有两个分支,A
并且B
.以下属性是否成立?
A
成B
冲突,当且仅当合并B
成A
冲突.A
将B
是一样的我的文件合并后的内容B
为A
.为什么从一-O
开始就充分懒惰?我发现自己不相信SPJ的"函数式编程语言的实现"中的推理.声称是在
f = \y -> y + sqrt 4
Run Code Online (Sandbox Code Playgroud)
sqrt 4
每次f
输入都会不必要地重复,所以我们应该将它浮动到lambda之外.我同意这一点,但是因为我们已经看到了这种转变导致的大问题我不相信它是值得的.在我看来,这种转换的好处可以单方面获得**只有本地代码更改,而想要它的程序员应该手动实现它.
你能说服我吗?是full-laziness
居然真的有用吗?如果你能提供需要多边合作或非地方转型的手工实施的例子,我将特别相信.
**与内联和流融合等优化不同,手动实现需要模块之间的多边合作和非本地代码更改
我有一个coroutine变压器
data Step y m a = Done a | Yield y (CoT y m a)
data CoT y m a = CoT (m (Step y m a))
Run Code Online (Sandbox Code Playgroud)
与Monad
实例
unCoT :: CoT y m a -> m (Step y m a)
unCoT (CoT m) = m
instance Monad m => Monad (CoT y m) where
return = CoT . return . Done
CoT x >>= f = CoT $ do
x' <- x
case x' of
Done a …
Run Code Online (Sandbox Code Playgroud) 我有类型的功能
(forall m. (MonadCo r m, MonadReader Int m) => m ())
-> (forall m. (MonadCo r m, MonadReader Int m) => m ())
Run Code Online (Sandbox Code Playgroud)
(MonadCo
我自己的类型类代表一个协程monad.如果你愿意,你可以考虑这个案例MonadError e m
.问题将是相同的.)
看起来我应该能够重新定义约束并最终得到类型签名的函数
(Equals k (MonadCo r, MonadReader Int))
=> (Constrain k ()) -> (Constrain k ())
Run Code Online (Sandbox Code Playgroud)
但我不知道如何在实践中实现这一点.我完全不知道是什么:-
,:=>
实际上是什么.我想我也需要一个Forall1
在那里,因为我普遍量化m
,但我不知道它应该适合.
我真正想做的是重新制定forall m. (MonadCo r m, MonadReader Int m)
约束.我认为,当我这样做时,左边出现的任何结果都将自动成为"正确的东西".
Data.Constraint
似乎非常强大,但我无法找到从哪里开始.
我试图理解index-core
风格中的索引monad .我陷入了一个悖论,即在构建一些例子之前我无法理解这些原则,在理解这些原理之前我无法构建例子.
我正在尝试构建一个索引状态monad.到目前为止,我的直觉告诉我它应该是这样的
type a :* b = forall i. (a i, b i)
newtype IState f a i = IState { runIState :: f i -> (a :* f) }
Run Code Online (Sandbox Code Playgroud)
并且我可以通过适当的设置f = Identity
和选择来恢复"受限制"状态monad a
:
type IState' s s' a = IState Identity (a := s') s
Run Code Online (Sandbox Code Playgroud)
但我感到很失落.有人可以确认我的线路正确吗?
我在索引的延续monad上使用类似的问题作为指导,但我认为它不够接近.
行分析输出google-pprof
声称我的数值 C++ 程序的大部分运行时间都花费在一个名为的函数中__nss_database_lookup
(见下文)。显然,该函数用于处理passwd
UNIX 系统上的文件等内容。我的 C++ 程序应该只进行数值计算、分配内存以及传递一些自定义 C++ 数据类型。
这是怎么回事?该功能的出现是否是海市蜃楼,仅仅是google-pprof
工作原理的产物?或者它实际上被调用并浪费了我的程序三分之二的运行时间?如果它被调用,那么调用它的可能是什么?我的 C++ 类中是否有错误地调用了它?我该如何追踪呢?
我正在使用 Ubuntu 20.04,g++-7
并且g++-9
.
Total: 1046 samples
665 63.6% 63.6% 665 63.6% __nss_database_lookup ??:0
107 10.2% 73.8% 193 18.5% <function1> file.h:1035
92 8.8% 82.6% 92 8.8% <function2> file.h:...
87 8.3% 90.9% 87 8.3% <function3> file.h:995
17 1.6% 92.5% 734 70.2% <function4> file.h:1128
...
Run Code Online (Sandbox Code Playgroud)
(出于保密原因,函数和文件名被隐藏)
我想要做
select col1, col2 from foo union values (null, null)
Run Code Online (Sandbox Code Playgroud)
但是null
默认类型为TEXT,因此出现错误“ UNION类型[例如]整数和文本无法匹配”。在特定情况下,我可以提供foo的列类型,但是我以编程方式构造SQL语句,如果我不必随身携带列类型信息,那将是更好的选择。
有没有解决方法?
理想情况下,我希望有一个Behaviour
我可以"轮询"以获得当前时间.但是,Behaviour
用Event
s(通过<@
等)进行轮询给出Behaviour
了前一个 Event
值,而不是当前值.(我意识到这是为了避免确实有用的循环定义.)
我发现fromPoll
我认为会有所帮助. Behaviour
这是从观察到的小号fromPoll
不能依靠自己,因此没有周期可以通过观察行为出台之前这个Event
被解雇,而不是刚过以前Event
解雇.
在某些更正式的术语中,我建议Event
s总是在时间t +发生,并且Behaviours
总是在时间t观察到-即Event
观察在它们之前无限短时间内发生的行为.新价值Behaviour
的生成S- accumB
和朋友们总是准时开始T +所以无法通过观察Event
S的也发生在时间T +.
在这个建议的语义下Behaviour
,fromPoll
将在每个Event
处理之前更新.其他Behaviour
s将在之后更新,因为它们是由accumB
朋友创建的.
无论如何,这对我的主要问题来说是一个重要的题外话.我想知道是否有某种方式来处理当前时间(而不是时间以前 Event
在反应香蕉).例如,我的用例是跟踪实体发送的ping,以及它们中的任何一个是否在特定时间间隔内没有发送ping来发出警告事件.
当然,我可以并且会非常频繁地发射事件,所以我的警告不会大量错误.然而,它似乎是一个瑕疵,他们不能准确.
处理这个问题的正确方法是什么?