使用相同的导管值执行多个操作是否安全?就像是
do
let sink = sinkSocket sock
something $$ sink
somethingElse $$ sink
Run Code Online (Sandbox Code Playgroud)
我记得在导管的早期版本中有一些脏的黑客使得这不安全.现状是什么?
(注意sinkSocket
不要关闭套接字.)
在Scrap中你的样板重新加载,作者描述了一个新的Scrap Your Boilerplate演示文稿,它应该与原版相同.
然而,一个不同之处在于它们假设一组有限的,基本的"基础"类型,用GADT编码
data Type :: * -> * where
Int :: Type Int
List :: Type a -> Type [a]
...
Run Code Online (Sandbox Code Playgroud)
在原始SYB中,使用类型安全转换,使用Typeable
类实现.
我的问题是:
我很欣赏Control.Lens包.它确实有助于稍微弱的Haskell记录语法.我正在研究图书馆的某些部分,其中表现是一个问题.有没有人知道如果有的话,使用通过类型类暴露的简单镜头(如下所示)与功能中的基本模式匹配相比会有什么性能损失?使用像这样的镜头有可能成为记录命名空间冲突问题的一个很好的工作.我可以自己设置一些基准测试,但是如果有人可以帮我解决问题,我很好奇.谢谢.
class LensX v where
_x :: Functor f => (Double -> f Double) -> v -> f v
class LensY v where
_y :: Functor f => (Double -> f Double) -> v -> f v
class LensZ v where
_z :: Functor f => (Double -> f Double) -> v -> f v
Run Code Online (Sandbox Code Playgroud)
instance LensX Vec3 where
_x f (Vec3 x y z) = fmap (\x' -> Vec3 x' y z) (f x)
instance LensY Vec3 …
Run Code Online (Sandbox Code Playgroud) 我正在使用反应性香蕉构建类似媒体播放器的应用程序.
假设我想要一个Behavior
代表曲目列表中当前所选曲目的曲目.
我有两个选择:用于fromPoll
在需要时获取当前选择; 或使用fromChanges
和订阅选择更改事件.
Behavior
仅当用户按下"播放"按钮时才使用所选曲目.此事件比选择更改更为罕见.
鉴于此,我认为这fromPoll
比fromChanges
在这种情况下更好/更有效.但是文档说"获得Behavior
s 的推荐方法是使用fromChanges
".
它仍适用于此吗?即,轮询操作的执行频率是否超过网络实际使用(采样)的时间?
我想拥有相同版本的GHC的不同的,非ABI兼容的版本,并在不同的项目中使用它们.
(在我的例子中,构建之间的差异是整数 - 简单与gmp.)
本期中的评论显示了如何添加ghc的自定义风格stack-setup-2.yaml
.但是,如何指定在每个特定情况或项目中使用哪个ghc构建?
即我正在寻找一个(更好的,两个):
stack.yaml
是使用整数简单还是gmp构建.stack build
要生成的构建.要一起捕获命令的 STDERR 和 STDOUT:
$输出 = `cmd 2>&1`;
要捕获命令的 STDOUT 但丢弃其 STDERR:
$output = `cmd 2>/dev/null`;
要捕获命令的 STDERR 但丢弃其 STDOUT(此处顺序很重要):
$output = `cmd 2>&1 1>/dev/null`;
要交换命令的 STDOUT 和 STDERR 以捕获 STDERR,但保留其 STDOUT 以输出旧的 STDERR:
$输出 = `cmd 3>&1 1>&2 2>&3 3>&-`;
我不明白3和4是如何工作的,我也不太确定我对1和2的理解是否正确。下面是我的理解。有不对的地方请指正。
我知道0
,1
和2
象征STDIN
着STDOUT
和STDERR
。
将 2 重定向到 1,以便它们现在都使用相同的流(&
转义1
以确保STDERR
不会重定向到名为的文件1
)
将 2 (STDERR) 重定向到空流,以便它被丢弃
我不明白这个。难道不应该只是
$output = `cmd …
让我说我有
e1 :: Event t A
f :: A -> IO B
Run Code Online (Sandbox Code Playgroud)
我想创造
e2 :: Event t B
Run Code Online (Sandbox Code Playgroud)
这是由触发e1
它们的值由执行确定,并且f
上的值e1
在事件发生的时间.
通过动态事件切换和使用处理程序,我看到了两种可能的方法,但是对于这么简单的事情,它们看起来都太复杂了.
这样做的正确方法是什么?
假设我有一个懒惰Tree
的叶子可能解决问题的方法
data Tree a = Node [Tree a] | Leaf (Maybe a)
Run Code Online (Sandbox Code Playgroud)
我需要找到一个解决方案(或者发现没有解决方案).
我有一台P -core机器.从时间和内存效率的考虑,只有并行搜索P个不同的分支才有意义.
例如,假设您有四个具有大约相同计算复杂度的分支(对应于CPU时间的T秒),并且每个分支都有一个答案.
如果你在双核机器上真正并行评估所有四个分支,那么它们都将在大约2T秒内完成.
如果你只评估前两个分支并推迟其他两个分支,那么你只需要T秒就能得到答案,同时使用两倍的内存.
我的问题是,是否可以使用任何并行Haskell基础结构(Par monad,并行策略......)来实现这一目标,还是必须使用像async这样的低级工具?
我的vim插件有一个跳转到不同位置的命令(就像标签一样).
我使用的cursor
功能.
如何在跳转列表中记录以前的位置,以便Ctrl+O按预期工作?
我正在阅读System V应用程序二进制接口,有一部分是我无法理解的.
首先,该文件指出
没有尝试为C以外的语言指定ABI
(第10页).
稍后,在第20页,数组分为MEMORY,POINTER等:
聚合(结构和数组)和联合类型的分类如下:
...
然后使用分类来定义调用约定 - 它们的值和边界如何传递给函数并从函数返回.如果我正确读取算法,则可以将数组分类为INTEGER,MEMORY或SSE.
但是在C语言中,数组总是作为指针传递和返回.那么为什么对数组进行分类以及在哪种情况下数组类很重要呢?