我有一些数据类型
data Outer = Outer { _list :: [ Inner ] }
data Inner = Inner { _bool :: Bool }
Run Code Online (Sandbox Code Playgroud)
使用Control.Lens,我可以访问第i个内部的_bool(在'State Outer'monad中)
boolValue <- gets (^. list . to (!! i) . inner)
Run Code Online (Sandbox Code Playgroud)
我也想用类似的东西来更新这个值
list ^. (to (!! i)) ^. inner %= True
Run Code Online (Sandbox Code Playgroud)
然而(根据我的理解),'to'功能只会创建一个getter,而不是一个可用作getter或setter的真实镜头.
那么,我怎样才能将(!! i)转换为可以让我更新此字段的镜头?
我有以下程序,在运行时不产生输出runhaskell Toy.hs,而是无限期挂起.根据我的理解,程序应该打印"hi"然后退出.我很感激有关如何调试此类问题的答案和/或建议.我正在使用Github的管道4.0.0(github.com/Gabriel439/Haskell-Pipes-Library).
module Toy where
import Pipes
import Control.Monad.State
type Request = String
type Response = String
serveChoice :: Request -> Server Request Response IO ()
serveChoice = forever go
where go req = do
lift $ putStrLn req
respond req
run :: Monad m => () -> Client Request Response (StateT Int m) ()
run () = do
request "hi"
return ()
main :: IO ()
main = evalStateT (runEffect $ hoist lift . serveChoice …Run Code Online (Sandbox Code Playgroud) 以下代码无法编译:
{-# LANGUAGE TemplateHaskell #-}
import Control.Lens
data MyType = MyType Int
data Outer = Outer { _inners :: [ Inner ] }
data Inner = Inner { _val :: MyType }
$(makeLenses ''Outer)
$(makeLenses ''Inner)
i1 = Inner (MyType 1)
i2 = Inner (MyType 2)
o = Outer [i1, i2]
x = o ^. inners . ix 0 . val
Run Code Online (Sandbox Code Playgroud)
给出这个错误
Toy.hs:17:23:
No instance for (Data.Monoid.Monoid MyType)
arising from a use of `ix'
Possible fix:
add an instance declaration …Run Code Online (Sandbox Code Playgroud) 我有一个使用ghcjs的小项目,目前最佳情况下增量重新编译时间为8秒,对于一个可疑的637行源代码(按计数find -L . -name '*.hs' | xargs wc -l | grep total).
最糟糕的罪犯是最后Linking client/Main.jsexe一步,需要3.8秒才能在每次增量构建中发生.
第二个最糟糕的罪犯是一个Linking Template Haskell步骤,大约需要2秒钟.这也发生在每次增量重建时,它来自于几个foreign import javascript声明.即使我将这些声明移动到我再也不会触及的单独模块/文件中,通过触摸代码库中的任何文件的增量构建会导致此链接步骤发生.
最后几秒来自实际编译我的源文件.这也很好,但这不是一个问题.
如何实现更严格的编译/反馈循环?
说我有这个代码:
import Control.Monad.State hiding (StateT)
import Control.Proxy
server :: (Proxy p, Monad m) => Int -> Server p Int Bool (StateT Int m) ()
server = runIdentityK loop
where loop arg = do
currMax <- lift get
lift $ put $ max currMax arg
nextArg <- respond (even arg)
loop nextArg
client :: (Proxy p, Monad m) => Client p Int Bool m ()
client = runIdentityP loop
where loop = go 1
go i = do
isEven <- request …Run Code Online (Sandbox Code Playgroud) 此外,这还取决于特质的细节。
我有两个最小的板条箱。第一个是一个图书馆箱子foo,里面有
#![allow(incomplete_features)]
#![feature(generic_const_exprs)]
pub trait KnownSize: Sized {
const N: usize = core::mem::size_of::<Self>();
}
impl<T: Sized> KnownSize for T {}
pub trait SizeIs<const N: usize> {}
impl<T: KnownSize> SizeIs<{ T::N }> for T {}
struct X(u32);
// Uncommenting either of these lines breaks due to conflict with blanket impls above
// impl KnownSize for X {}
// impl SizeIs<4> for X {}
Run Code Online (Sandbox Code Playgroud)
在板条箱里bar,我有
use foo::*;
struct X(u32);
// Uncommenting this line breaks due to conflict …Run Code Online (Sandbox Code Playgroud) 我改变了一些代码,用来在内部运行的StateT单子到内运行StateP的Control.Proxy.但是,我的一些代码(例如%=运算符来自Control.Lens)需要一个MonadState实例.我只是添加这样的实例是安全/正确的吗?这似乎是库最正确处理的东西(在本例中Control.Proxy).
从http://book.realworldhaskell.org/read/monad-transformers.html复制的这个MonadState实例给出了GHC 7.4.2的错误
instance (MonadState s m) => MonadState s (MaybeT m) where
get = lift get
put k = lift (put k)
Run Code Online (Sandbox Code Playgroud)
给
Illegal instance declaration for `MonadState s (MaybeT m)'
(All instance types must be of the form (T a1 ... an)
where a1 ... an are *distinct type variables*,
and each type variable appears at most once in the instance head.
Use -XFlexibleInstances if you want to disable this.)
In the instance declaration for `MonadState s …Run Code Online (Sandbox Code Playgroud) 如果我在一个大项目中有多个文件,所有文件共享大量包含的头文件,有什么办法可以共享解析头文件的工作吗?我曾希望创建一个索引然后向其中添加多个 translationUnit 可以导致一些工作被共享 - 但是即使是(伪代码)
index = clang_createIndex();
clang_parseTranslationUnit(index, "myfile");
clang_parseTranslationUnit(index, "myfile");
Run Code Online (Sandbox Code Playgroud)
每次调用 parseTranslationUnit 似乎都花费了全部时间,性能并不比
index1 = clang_createIndex();
clang_parseTranslationUnit(index1, "myfile");
index2 = clang_createIndex();
clang_parseTranslationUnit(index2, "myfile");
Run Code Online (Sandbox Code Playgroud)
我知道有专门的函数可以重新解析完全相同的文件;然而,我真正想要的是解析“myfile1”和“myfile2”可以共享解析“myheader.h”的工作,并且重新解析特定的函数在那里无济于事。
作为一个子问题,重用索引和为每个翻译单元创建新索引之间有什么有意义的区别吗?
这个小程序的目的是显示三个按钮,第三个按钮的标签最初为"0",之后是最后点击按钮的索引.现在,按钮的数量和其他按钮的标签是不变的.
当我使用ghcjs编译这个自包含文件并在浏览器中加载Main.jsexe/index.html时,我可以看到两个traceDyns在循环中触发,两者总是具有值0.据我所知,什么都不应该发生直到单击一个按钮,因为_el_clicked为系统的其余部分提供信息.
另外,请注意我正在使用mapDyn (fst . head . Map.toList)以提取所选按钮的索引 - 我不确定这是否正确,但无论哪种方式我都不知道导致无限循环的原因.
{-# LANGUAGE RecursiveDo #-}
module Main where
import Reflex
import Reflex.Dom
import qualified Data.Map as Map
dynButton
:: MonadWidget t m
=> Dynamic t String
-> m (Event t ())
dynButton s = do
(e, _) <- el' "button" $ dynText s
return $ _el_clicked e
-- widget that takes dynamic list of strings
-- and displays a button for each, returning
-- an event of chosen button's …Run Code Online (Sandbox Code Playgroud)