小编mb1*_*b14的帖子

如何让cabal和nix一起工作

据我所知,Nixcabal沙箱的替代品.我终于设法安装了Nix,但我仍然不明白它如何取代沙盒.

我知道你不需要使用Nix和封装版GHC的cabal; 但是如果你想发布一个软件包,你需要在某个时候用cabal打包它.因此,您需要能够在NIX中编写和测试您的cabal配置.你是怎样做的?

理想情况下,我想要一个类似于cabal沙箱但在NIX中"包含"的环境,这可能吗?事实上,我真正想要的是等效的嵌套沙箱 - 因为我通常使用由多个包组成的项目.

更新我当前的工作流程

目前我在2或3个独立项目(P1,P2,P3)上工作,每个项目由2或3个cabal模块/包组成,假设P1:L11,L12(库)和E11(可执行文件).E11取决于L12,它取决于L11.我主要是从库中拆分可执行文件,因为它们是私有的,并保存在私有git仓库中.

理论上,每个项目都可以拥有自己的沙箱(在其子模块之间共享).我尝试过(有一个L11 L12和E11的普通沙箱),但它很快就会烦人,因为如果修改L11,你就无法重建它,因为E11依赖它,所以我必须首先卸载E11重新编译L11.情况可能并非如此,但我遇到了类似的问题.如果我偶尔修改L11,这样会好的,但在实践中,我更改了E11.

由于共享沙箱不起作用,所以我回到了每个包解决方案的一个沙箱.它工作但不太理想.主要问题是如果我修改L11,我需要编译两次(一次在L11中,然后再在E11中).此外,每次我开始一个新的沙箱时,每个人都知道,我需要等待一段时间才能让所有包下载并重新编译.

因此,通过使用Nix,我正在努力为每个项目设置单独的cabal"环境",这解决了上述所有问题.

希望这更清楚.

haskell cabal nix

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

有没有一种限制/钳制数字的方法?

我写了以下代码,它保持x在范围内(a..b).在伪代码中:

(if x < a, x = a; if x > b, x = b)
Run Code Online (Sandbox Code Playgroud)

在Ruby中它将是这样的:

x = [a, [x, b].min].max
Run Code Online (Sandbox Code Playgroud)

由于它是非常基本和有用的功能,我想知道是否有一个本机方法在ruby中这样做.

从Ruby 2.3.3开始,显然没有这样的方法,最短/更易读的方法是什么?

我发现:

x = [a, x, b].sort[1]
Run Code Online (Sandbox Code Playgroud)

到目前为止,但我不确定它是否更具可读性.

ruby clamp

26
推荐指数
3
解决办法
7231
查看次数

如何在let绑定中添加类型注释

我是Haskell的初学者(ish),我发现错误信息真的很难理解(我想它随着时间的推移而来).无论如何,为了帮助我理解我的错误,我尝试在let绑定中添加带有类型注释的中间变量,并发现它产生更多错误,即使我的类型(我认为)正确.

例;

f :: a -> a
f x = 
    let x' = x :: a
    in x'
Run Code Online (Sandbox Code Playgroud)

生成以下错误

test.hs:3:12:
Couldn't match expected type `a2' with actual type `a'
  `a2' is a rigid type variable bound by
       an expression type signature: a2 at test.hs:3:12
  `a' is a rigid type variable bound by
      the type signature for f :: a -> a at test.hs:1:6
In the expression: x :: a
In an equation for x': x' = x :: a
In …
Run Code Online (Sandbox Code Playgroud)

haskell

23
推荐指数
2
解决办法
4432
查看次数

如何将可选标志解析为Maybe值?

我正在尝试使用optparse-applicative来解析一个Maybe String但我找不到任何地方如何处理Maybe.我发现的唯一的事情是添加一个默认值,但我真的需要一个Nothingif用户没有提供选项而不是"".有没有办法实现这个目标?

以下是工作代码的示例:

import Options.Applicative

data Config = Config
    { cIn :: String
    , cOut :: String
    } deriving Show

configParser :: Parser Config
configParser = Config
    <$> strOption (long "in" <> short 'i')
    <*> strOption (long "out" <> short 'o')


main :: IO ()
main = do
    conf <- execParser (info configParser fullDesc)
    print conf
Run Code Online (Sandbox Code Playgroud)

但是,我希望参数是可选的,Maybe String而不是StringConfig:

data Config = Config
    { cIn …
Run Code Online (Sandbox Code Playgroud)

haskell command-line-arguments applicative optparse-applicative

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

如何组合镜头(不构成)

在没有镜头的haskell中,我可以做以下事情:

data Item = Item { quantity :: Double, price ::Double }

cost :: Item -> Double
cost = (*) <$> quantity <*> price
Run Code Online (Sandbox Code Playgroud)

如果我使用镜头,我该怎么做相同的?我能做的最好的是

cost = to $ (*) <$> (^. quantity) <*> (^. price)
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法 ?(当然我想要一个getter或同等的)

haskell haskell-lens

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

为什么限制数据是件坏事?

我知道这个问题已被多次询问和回答,但我仍然不明白为什么对数据类型设置约束是一件坏事.

例如,我们来看看Data.Map k a.所有涉及Map需要Ord k约束的有用函数.所以对于定义有一个隐含的约束Data.Map.为什么更好地保持隐含而不是让编译器和程序员知道Data.Map需要可订购密钥.

此外,在类型声明中指定最终类型是常见的,可以将其视为"超级"约束数据类型的方式.

例如,我可以写

data User = User { name :: String }
Run Code Online (Sandbox Code Playgroud)

这是可以接受的.然而,这不是一个受限制的版本

data User' s = User' { name :: s }
Run Code Online (Sandbox Code Playgroud)

我会为写功能的所有99%后User类型并不需要String和这将很可能只需要少数sIsStringShow.

那么,为什么松散的版本被User认为是坏的:

data (IsString s, Show s, ...) => User'' { name :: s }
Run Code Online (Sandbox Code Playgroud)

而这两个UserUser'被认为是好?

我问这个,因为很多时候,我觉得我不必要地缩小我的数据(甚至函数)定义,只是为了不必传播约束.

更新

据我所知,数据类型约束仅适用于构造函数,不会传播.那么我的问题是,为什么数据类型约束不能按预期工作(和传播)?无论如何,这是一个扩展,那么为什么没有一个新的扩展data正常,如果它被社区认为是有用的?

haskell

20
推荐指数
2
解决办法
1691
查看次数

有没有使用游标或智能提取的Ruby ORM?

我正在寻找一个Ruby ORM来取代ActiveRecord.我一直在看Sequel和DataMapper.它们看起来很不错,但是它们似乎都不是基本的:当你不需要时,不要将所有内容都加载到内存中.

我的意思是我在ActiveRecord和Sequel上尝试了以下(或等效的)有很多行的表:

 posts.each { |p| puts p }
Run Code Online (Sandbox Code Playgroud)

他们两个都记忆犹新.它们似乎将所有内容加载到内存中,而不是在需要时获取内容.我find_in_batches在ActiveRecord中使用了它,但这不是一个可接受的解决方案:

  1. ActiveRecord不是一个可接受的解决方案,因为我们遇到了太多问题.
  2. 为什么我的代码应该知道分页机制?我很高兴配置页面大小的某个地方,但就是这样.有了find_in_batches你需要做的是这样的:

    post.find_in_batches {| batch | batch.each {| p | 把p}}

但这应该是透明的.

那么有可靠的Ruby ORM可以正确获取吗?


更新:

正如塞尔吉奥所说,在Rails 3中你可以使用find_each我想要的东西.但是,由于ActiveRecord不是一个选项,除非有人能说服我使用它,所以问题是:

  1. 哪些ORM支持相当于find_each?
  2. 怎么做?
  3. 为什么我们需要一个find_each,而find应该这样做,不应该吗?

ruby orm datamapper sequel

19
推荐指数
2
解决办法
4589
查看次数

正确导入已在Haskell中的Prelude中定义的内容

我正在尝试在Haskell中定义一个可折叠的实例,我在导入时遇到了一些问题.

所以先试试:模块MyList在哪里

import Data.Foldable

data MyList a = MyList [a]

instance Foldable (MyList) where
  foldr f b (MyList as) = foldr f b as
Run Code Online (Sandbox Code Playgroud)

结果(正常但很烦人)

模糊发生`foldr'

所以,我想我必须将它从Prelude:模块MyList中隐藏起来

import Prelude hiding (foldr)
import Data.Foldable

data MyList a = MyList [a]

instance Foldable (MyList) where
  foldr f b (MyList as) = foldr f b as
Run Code Online (Sandbox Code Playgroud)

这个编译,我加载到ghci并尝试一些基本的东西:

*MyList> foldr (:) "" (MyList "hello")
"hello"
*MyList> foldl (flip (:)) "" (MyList "hello")

<interactive>:1:0:
    Ambiguous occurrence `foldl'
    It could refer to either `Prelude.foldl', imported from …
Run Code Online (Sandbox Code Playgroud)

haskell coding-style

15
推荐指数
3
解决办法
3769
查看次数

无法在Mac上安装图表/ arithmoi

我正在尝试安装diagrams(在cabal沙箱中)并且在arithmoi安装过程中失败,给出以下消息:

Preprocessing library arithmoi-0.4.1.1...

no location info>:
    Warning: Couldn't figure out LLVM version!
         Make sure you have installed LLVM
ghc: could not execute: opt
Failed to install arithmoi-0.4.1.1
cabal: Error: some packages failed to install:
arithmoi-0.4.1.1 failed during the building phase. The exception was:
ExitFailure 1
diagrams-1.2 depends on arithmoi-0.4.1.1 which failed to install.
diagrams-contrib-1.1.2 depends on arithmoi-0.4.1.1 which failed to install.
Run Code Online (Sandbox Code Playgroud)

我不确定为什么我没有安装LLVM后端或为什么它可以执行opt.任何的想法 ?(我在OS 10.8上使用GHC 7.6.3)

macos haskell cabal

13
推荐指数
3
解决办法
1009
查看次数

为什么GHCI在出错后会陷入错误状态?

首先,我为非描述性标题道歉.由于我不知道实际发生了什么,所以我无法让它更具体.

现在我的问题.我已经为99个Haskell问题中的问题23实现了以下代码段,它应该n从列表中随机选择项目:

rndSelect' :: RandomGen g => [a] -> Int -> g -> ([a], g)
rndSelect' _ 0 gen = ([], gen)
rndSelect' [] _ _ = error "Number of items requested is larger than list"
rndSelect' xs n gen = ((xs !! i) : rest, gen'')
                    where (i, gen') = randomR (0, length xs - 1) gen
                          (rest, gen'') = (rndSelect' (removeAt xs i) (n - 1) gen')

rndSelectIO' :: [a] -> Int -> IO …
Run Code Online (Sandbox Code Playgroud)

monads haskell io-monad

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