小编ajp*_*ajp的帖子

如何使用Control.Lens更新列表的第i个元素?

我有一些数据类型

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)转换为可以让我更新此字段的镜头?

haskell lenses

13
推荐指数
2
解决办法
2609
查看次数

使用Pipes的简单程序挂起

我有以下程序,在运行时不产生输出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)

haskell haskell-pipes

7
推荐指数
1
解决办法
256
查看次数

使用Control.Lens的索引列表需要Monoid约束

以下代码无法编译:

{-# 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)

haskell lenses haskell-lens

7
推荐指数
1
解决办法
853
查看次数

如何使用ghcjs减少(增量)编译时间?

我有一个使用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声明.即使我将这些声明移动到我再也不会触及的单独模块/文件中,通过触摸代码库中的任何文件的增量构建会导致此链接步骤发生.

最后几秒来自实际编译我的源文件.这也很好,但这不是一个问题.

如何实现更严格的编译/反馈循环?

haskell ghcjs

7
推荐指数
0
解决办法
235
查看次数

如何拥有多种通信类型的管道?

说我有这个代码:

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)

haskell haskell-pipes

6
推荐指数
1
解决办法
201
查看次数

为什么特征实现只在同一个板条箱内发生冲突?

此外,这还取决于特质的细节。

我有两个最小的板条箱。第一个是一个图书馆箱子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)

rust

6
推荐指数
0
解决办法
66
查看次数

我可以从Control.Proxy生成StateP MonadState的实例吗?

我改变了一些代码,用来在内部运行的StateT单子到内运行StatePControl.Proxy.但是,我的一些代码(例如%=运算符来自Control.Lens)需要一个MonadState实例.我只是添加这样的实例是安全/正确的吗?这似乎是库最正确处理的东西(在本例中Control.Proxy).

monads haskell haskell-pipes

5
推荐指数
1
解决办法
147
查看次数

来自Real World Haskell的MonadState实例无法编译

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)

haskell monad-transformers

5
推荐指数
1
解决办法
286
查看次数

使用 libclang 解析多个文件时可以共享工作吗?

如果我在一个大项目中有多个文件,所有文件共享大量包含的头文件,有什么办法可以共享解析头文件的工作吗?我曾希望创建一个索引然后向其中添加多个 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”的工作,并且重新解析特定的函数在那里无济于事。

作为一个子问题,重用索引和为每个翻译单元创建新索引之间有什么有意义的区别吗?

libclang

5
推荐指数
1
解决办法
1484
查看次数

为什么这个Reflex代码导致Dynamics无限期地以相同的值发射?

这个小程序的目的是显示三个按钮,第三个按钮的标签最初为"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)

haskell ghcjs reflex

5
推荐指数
1
解决办法
398
查看次数