小编dfl*_*str的帖子

具有部分原子性的STM用于某些TVars

我正在使用STM做事,除此之外还使用了TBQueue数据结构并取得了巨大的成功.我一直在使用它的一个有用功能包括根据a中的前提条件从中读取TVar,基本上是这样的:

shouldRead <- readTVar shouldReadVar
if shouldRead
  then do
    a <- readTBQueue queue
    doSomethingWith a
  else doSomethingElse
Run Code Online (Sandbox Code Playgroud)

如果我们假设在执行此块之前它queue是空的并且shouldReadVar包含True它,那么它将导致readTBQueue调用retry,并且当shouldReadVar包含Falsequeue包含元素时,块将被重新执行,无论先发生什么.


我现在需要一个同步通道数据结构,类似于本文中描述的结构(如果你想理解这个问题,请阅读它),除非它需要在前一个例子中的前置条件下可读,也可能与其他东西一起构成.

让我们SyncChan用它来定义这个数据结构writeSyncChanreadSyncChan定义操作.

这是一个可能的用例:这个(伪)代码(因为我混合了STM/IO概念,所以不会起作用):

shouldRead <- readTVar shouldReadVar
if shouldRead
  then do
    a <- readSyncChan syncChan
    doSomethingWith a
  else doSomethingElse
Run Code Online (Sandbox Code Playgroud)

假设当前没有其他线程在writeSyncChan调用上阻塞,并且shouldReadChan包含True,我希望块" retry"直到shouldReadChan包含False,或者在a上包含不同的线程块 …

synchronization haskell transactions ghc stm

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

与主机名无关的Yesod应用程序

这是一个非常简单的问题:如何运行可以同时处理多个主机的Yesod应用程序?

默认的Yesod设置可以处理来自任何主机的传入连接,但所有URL都会approot在它们前面进行渲染.joinPath如果存在一种存储当前域的方式以便该函数可用,那么覆盖Yesod实例声明是可能的,但是没有.

这个维基页面上描述的方法有效,但是非常hackish,因为它强制路由采取额外的domain参数(因为我没有一组静态的域匹配).出于实际目的(因为我有很多路由,其中​​一些是与域无关的),最好有一个解决方案使路由不受影响,因为仍然可以从WAI请求信息中获取主机名.处理函数.

我使用需要绝对URL的东西(例如电子邮件,RSS,XML API),因此approot _ = ""不是一种选择.

我不能也不能在编译时知道需要支持的所有主机名.

那么,如何呈现URL以便它们使用传入请求的主机名,而不是approot变量?

haskell vhosts yesod

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

如何获取TemplateHaskell命名变量的文字值

如果我Name在TemplateHaskell中有一个并且想要找出它命名的变量的值,只要该变量被声明为文字,这可以完成吗?

var = "foo"
-- Can `contentsOf` be defined?
$((contentsOf . mkName $ "var") >>= guard . (== "foo"))
Run Code Online (Sandbox Code Playgroud)

macros interpolation haskell metaprogramming template-haskell

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

具有色差的反射/折射 - 眼睛矫正

我正在编写一个模拟简单物体色差的GLSL着色器.我保持OpenGL 2.0兼容,所以我使用内置的OpenGL矩阵堆栈.这是简单的顶点着色器:

uniform vec3 cameraPos;

varying vec3 incident;
varying vec3 normal;

void main(void) {
    vec4 position = gl_ModelViewMatrix * gl_Vertex;
    incident = position.xyz / position.w - cameraPos;
    normal   = gl_NormalMatrix * gl_Normal;

    gl_Position = ftransform();
}
Run Code Online (Sandbox Code Playgroud)

cameraPos正如人们可能想象的那样,制服是相机在模型空间中的位置.这是片段着色器:

const float etaR = 1.14;
const float etaG = 1.12;
const float etaB = 1.10;
const float fresnelPower = 2.0;
const float F = ((1.0 - etaG) * (1.0 - etaG)) / ((1.0 + etaG) * (1.0 + etaG));

uniform samplerCube environment; …
Run Code Online (Sandbox Code Playgroud)

opengl glsl matrix

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

Yesod与页面流程形成

某些表单太复杂,不适合一页.例如,如果表单涉及大量结构化数据,例如在地图上选择位置,在日历窗口小部件中安排事件,或者根据先前的输入更改表单的某些部分,则能够在多个页面上分解某种形式.

这对于动态网页和Javascript很容易,因为人们只需创建一个包含不同页面的选项卡小部件,实际提交的表单将包含整个选项卡小部件及其所有输入字段,从而产生POST对整个操作的单个请求.

但是,有时候生成某些输入字段需要很长时间; 即使在页面生成之后,它们甚至可能是计算密集型的,对低端计算机用户的浏览器造成负担.另外,基于先前的输入创建适应自己的形式变得困难或不可能.

因此,有必要在多个完整页面请求上拆分某种形式.

这可能被证明是困难的,特别是因为表单的第一页将POST发送/location/a,其将发出重定向并由客户端/location/b请求GET.将存储的表单数据传递POST /location/aGET /location/b难以处理的地方.

Spring Web Flow的创建者Erwin Vervaet(Spring框架的一个子项目,主要以其依赖注入功能而闻名)曾写过一篇博客文章,在所述框架中演示了这一功能,并将其与实现类似功能的Lift Web Framework进行了比较.然后,他向其他Web框架提出了挑战,这将在后面的文章中进一步描述.

Yesod将如何面对这个问题,特别是考虑到其基于REST的无状态特性?

forms rest haskell session-state yesod

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

如何最惯用地在 Rust 中为 no_std 平台编写异步 IO 库?

我正在构建一个在平台上使用的库,no_std该库允许您执行一些常见的与网络相关的 IO,例如发出 HTTP 请求或读取/写入 Websockets。

现在,我希望这个库成为一个行为良好的公民,以便它可以轻松地包含在其他no_std应用程序中。因此,我想通过实现合理的特征等来打包该库。该库将允许我不必使用alloc,因此支持 non-alloc no_std将是理想的选择。

这些是我看过的选项:

  • embedded_haland nb:这些板条箱的级别确实很低(没有像ReadWrite或任何更高级别的通用特征)并且异步模型似乎与async/await
  • genio// core_io...:这些根本不支持异步IO。
  • embrio:看起来很有趣,但似乎使用它会将我束缚在一个特定的环境中,从而使该库的可移植性较差。
  • tokiov0.2.x:我很想使用它,但no_std根本不支持。
  • futures::iov0.3.x:同样,很想使用它,但没有no_std支持。

我应该在 no_std 环境中使用哪种异步 IO 抽象?如果现在没有好的选择,我应该为未来下注/提供帮助?

embedded io rust rust-no-std

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

Haskell:使用递归进行数值积分

我现在正在给Haskell一个忙,并努力在递归方面重写循环.

我正在尝试编写一个基本积分器,它取一些函数f(x)并通过Midpoint方法在[a,b]范围内进行积分.积分函数采用三个参数N,a和b,其中N是用于近似积分的矩形的数量.

Wolfram Alpha链接

当我尝试用GHCI编译它时,我得到了很多抽象的错误消息,我真的不知道从哪里开始.大量"超出范围"和几个"Main.a [或b]的多重声明".

谢谢

MPInt 1 a b = DELTA 1 -- Base case
MPInt N a b = (MPInt (N-1) a b) + DELTA
     where 
     dX = (b - a) / N
     DELTA = dX * f (a + dX * (N+0.5))

f :: (Num a) => a -> a
f x = x^2
Run Code Online (Sandbox Code Playgroud)

recursion haskell numerical-methods

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

在字符串解析期间捕获错误

我想解析String以获取Int,我使用它:

string2int :: String -> Int
string2int str = read str::Int
Run Code Online (Sandbox Code Playgroud)

现在我想尽可能地将备用异常/错误视为SIMPLY.我试过了:

import qualified Control.Exception as E

eVal <- try (print (string2int "a")) :: IO (Either E.SomeException ())
   case eVal of
      Left e -> do { putStrLn "exception"; }
      Right n -> do { putStrLn "good"; }
Run Code Online (Sandbox Code Playgroud)

但编译说couldn't match expected type 'E.SomeException()' with actual type E.IOException.

我究竟做错了什么?

好吧我不知道如何使用它来解决我的问题:我想要这样的事情:

loadfunction = do
{
   x <- string2int getLine
   if( failed parsing int ) call somefunction
   y <- string2int getLine
  if( …
Run Code Online (Sandbox Code Playgroud)

haskell

0
推荐指数
1
解决办法
840
查看次数