小编jbe*_*man的帖子

如何制作"分支"导管?

我想将相同的数据分成两个"分支"进行单独处理,然后"加入"......

                                +----------+
                +---------+  -->| doublber |---   +--------+
   +--------+   |         |--   +----------+   -->|        |   +------+
   | source |-->| splitter|                       | summer |-->| sink |
   +--------+   |         |--   +----------+   -->|        |   +------+
                +---------+  -->| delayer  |---   +--------+
                                +----------+
Run Code Online (Sandbox Code Playgroud)

我该怎么做?

我的尝试:

import Data.Conduit
import Control.Monad.IO.Class
import qualified Data.Conduit.List as CL
-- import Data.Conduit.Internal (zipSources)
import Control.Arrow ((>>>))

source :: Source IO Int
source = do
    x <- liftIO $ getLine
    yield (read x)
    source

splitter :: Conduit Int IO (Int, Int)
splitter = …
Run Code Online (Sandbox Code Playgroud)

haskell conduit

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

帮助GHC在一个常量上unbox一个Int

这是一个测试程序:

main = do
    n <- fmap read $ getLine :: IO Int
    if (999999 == n) then putStrLn "equal" else return ()
Run Code Online (Sandbox Code Playgroud)

以下是编译时的相关核心位ghc --make -O2 -ddump-to-file -ddump-simpl -dsuppress-module-prefixes -dsuppress-uniques -ddump-core-stats -ddump-inlinings:

case readEither6 @ Int (run @ Int main3 ipv1) of _ [Occ=Dead] {
  [] -> case error @ Int readEither4 of wild1 { };
  : x ds1 ->
    case ds1 of _ [Occ=Dead] {
      [] ->
        case x of _ [Occ=Dead] { I# ipv2 ->
        case …
Run Code Online (Sandbox Code Playgroud)

optimization unboxing haskell ghc

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

根据 YAML 1.1 规范,“yes”真的是“true”的别名吗?1.2 规格?

我正在尝试调试一个问题,它归结为......

>>> import yaml as pyyaml
>>> import ruamel.yaml as ruamel
>>> ruamel.load("x: yes") == ruamel.load("x: true")
False
>>> pyyaml.safe_load("x: yes") == pyyaml.safe_load("x: true")
True
Run Code Online (Sandbox Code Playgroud)

互联网上有传言称“yes”和“no”是保留词,分别是和 的同义词。truefalse

但 1.1 规范中只是顺便提及,但没有详细说明,并且字符串“yes”根本没有出现在1.2 规范中。

事实上,仔细查看规范的每个草案,它只会以合法的方式以任何合法的方式出现在https://yaml.org/spec/history/2002-09-01.html中,并在之后的修订中被删除。

我怀疑我在写它的过程中已经回答了我自己的问题,但是......这个关于“是/否”的事情只是胡说八道吗?它进入了实现(我的编辑甚至强调“是/否”作为特殊),或者我误解或遗漏了规范的一部分?

python yaml pyyaml ruamel.yaml

7
推荐指数
2
解决办法
2327
查看次数

有单元课吗?它会有用吗?

是否存在具有单个单位值的类型(此处不确定正确的术语),即具有某些预定义值的类型?

class Unit a where
    unit :: a

instance Unit () where
    unit = ()

instance Unit (Maybe a) where
    unit = Nothing
Run Code Online (Sandbox Code Playgroud)

...适用于所有Monoids,MonadPlus等

我想这个班的另一个名字可能是Default.这对我来说最近有用了两次.

可能不能令人信服的例子:

extract :: (Unit r)=> Reader r a -> a
extract r = runReader r unit
Run Code Online (Sandbox Code Playgroud)

这存在吗?别人认为它可能有用吗?

haskell

6
推荐指数
2
解决办法
263
查看次数

确定核心内存分配的位置

这可能是一个愚蠢的问题或过于开放,但我在GHC核心输出中寻找什么来了解内存分配发生的位置?我的动机是为了更好地了解如何优化代码像这样,还是如要尽量避免在并发代码的关键部分抢占.

performance haskell memory-management ghc

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

专门针对相关的多态函数而不进行内联

这是一个简单的例子,重现了我正在研究的一个真正的问题:

一个库模块:

module Lib where

class H h where
  hash :: (S s)=> s -> h -> s

class S s where
  mix :: s -> Int -> s

instance (H x, H y)=> H (x,y) where
  hash s = \(x,y) ->
    s `hash` x `hash` y
      -- make this look "big":
      `hash` x `hash` y `hash` x `hash` y `hash` x `hash` y `hash` x `hash` y
      `hash` x `hash` y `hash` x `hash` y `hash` x `hash` y …
Run Code Online (Sandbox Code Playgroud)

performance haskell inline ghc

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

了解线程GHC Haskell程序的子进程

我试图了解父级和各种子OS线程如何在使用GHC编译的haskell程序中工作-threaded

使用

module Main where
import Control.Concurrent
main = do
    threadDelay 9999999999
Run Code Online (Sandbox Code Playgroud)

我可以-threaded在ghc 8.6.5上编译并运行,+RTS -N3例如

$ pstree -p 6615 
hello(6615)???{ghc_ticker}(6618)
            ??{hello:w}(6616)
            ??{hello:w}(6617)
            ??{hello:w}(6619)
            ??{hello:w}(6620)
            ??{hello:w}(6621)
            ??{hello:w}(6622)
            ??{hello:w}(6623)
Run Code Online (Sandbox Code Playgroud)

看起来N*2 + 1随着我的变化,我得到了这些“ hello:w”线程+RTS -N

这些“ hello:w”线程是什么,为什么每个HEC + 1显然有两个线程?

怎么ghc_ticker办?

我还注意到,在我正在测试的大型真实服务中+RTS -N4,例如,我获得了14个“ my-service:w”线程,在负载下,这些进程ID似乎搅动(其中一半保持活动状态,直到我杀死了服务)。

为什么14,为什么其中一半会生成并死亡?

我还将接受一个答案,该答案有助于指导我检测代码以找出后两个问题。

multithreading haskell ghc child-process

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

ghc 的 FUN_1_0、FUN_0_1 等闭包类型是什么意思?

封闭类型的FUN_1_0THUNK_1_0等经常出现在堆配置文件,但不记录任何地方。中未记录的类型ghc-heap对应于这些常量,并且还有一些进一步的线索,Layout.hs但仍然不清楚这些是什么意思。

这个答案暗示FUN_1_0FUN_2_0对应于一两个参数的函数,但这似乎是错误的(因为没有FUN_3_0例如)

各种FUN_THUNK_类型是什么意思?

haskell ghc

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

贪心算法的改进

我一直在研究使用Haskell的抽象国际象棋算法(试图扩展我对不同范式的理解),并且我遇到了一个我一直在思考几周的挑战.

这是问题所在:

给定一个板(由整数列表表示;每个整数代表一个后续点值),维度为nxn,确定提供最多点的路径.如果最佳路径存在平局,则返回其中任何一个.

以下是具体内容:

A = [[5,4,3,1],[10,2,1,0],[0,1,2,0],[2,3,4,20]] 
Run Code Online (Sandbox Code Playgroud)

其呈现为:

R1: 5  4  3  1, R2: 10 2 1 0, R3: 0 1 2 0, R4: 2 3 4 20.
Run Code Online (Sandbox Code Playgroud)

规则是:

  1. 你可以从最上面的任何地方开始

  2. 您可以一次移动一个方格,可以是直下,左下(对角线)或右下(对角线).

  3. 输出必须是整数元组.

第一个元素是表示列与行的列表,第二个元素是总点数.例如.对于上面的板,最好的解决方案是从左上角(5)行进并沿对角线行进剩余的步骤(直到20点方形).这将导致元组([1,2,3,4], 29).

记住,这一切都在Haskell中,因此它是一个功能范式的递归问题.起初,我正在考虑使用贪婪算法,即选择r1中的最高值,并通过比较接下来的3种可能性进行递归; 选择3中的最高值.然而,垮台是贪婪算法无法在下一行之前看到潜力.

我该怎么做?我不是在寻找代码本身,因为我喜欢自己解决问题.但是,非常感谢伪代码或一些算法指导!

algorithm optimization recursion haskell greedy

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

基于字节顺序进行有条理的编译

我正在Word从字节数组中读取s并且需要使我的代码的一部分以字节序识别.GHC是否暴露了任何MachDeps.h可以用于使代码以处理器字节顺序为条件的代码?如果没有,我可以可靠地推断出HOST_ARCH(通过ghcplatform.harch()条件的.cabal文件中的可访问性)吗?还是其他想法?

haskell endianness ghc cabal

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