据我所知,Nix是cabal沙箱的替代品.我终于设法安装了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"环境",这解决了上述所有问题.
希望这更清楚.
我写了以下代码,它保持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)
到目前为止,但我不确定它是否更具可读性.
我是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) 我正在尝试使用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而不是String在Config:
data Config = Config
{ cIn …Run Code Online (Sandbox Code Playgroud) haskell command-line-arguments applicative optparse-applicative
在没有镜头的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或同等的)
我知道这个问题已被多次询问和回答,但我仍然不明白为什么对数据类型设置约束是一件坏事.
例如,我们来看看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和这将很可能只需要少数s是IsString和Show.
那么,为什么松散的版本被User认为是坏的:
data (IsString s, Show s, ...) => User'' { name :: s }
Run Code Online (Sandbox Code Playgroud)
而这两个User和User'被认为是好?
我问这个,因为很多时候,我觉得我不必要地缩小我的数据(甚至函数)定义,只是为了不必传播约束.
据我所知,数据类型约束仅适用于构造函数,不会传播.那么我的问题是,为什么数据类型约束不能按预期工作(和传播)?无论如何,这是一个扩展,那么为什么没有一个新的扩展data正常,如果它被社区认为是有用的?
我正在寻找一个Ruby ORM来取代ActiveRecord.我一直在看Sequel和DataMapper.它们看起来很不错,但是它们似乎都不是基本的:当你不需要时,不要将所有内容都加载到内存中.
我的意思是我在ActiveRecord和Sequel上尝试了以下(或等效的)有很多行的表:
posts.each { |p| puts p }
Run Code Online (Sandbox Code Playgroud)
他们两个都记忆犹新.它们似乎将所有内容加载到内存中,而不是在需要时获取内容.我find_in_batches在ActiveRecord中使用了它,但这不是一个可接受的解决方案:
为什么我的代码应该知道分页机制?我很高兴配置页面大小的某个地方,但就是这样.有了find_in_batches你需要做的是这样的:
post.find_in_batches {| batch | batch.each {| p | 把p}}
但这应该是透明的.
那么有可靠的Ruby ORM可以正确获取吗?
更新:
正如塞尔吉奥所说,在Rails 3中你可以使用find_each我想要的东西.但是,由于ActiveRecord不是一个选项,除非有人能说服我使用它,所以问题是:
find_each,而find应该这样做,不应该吗?我正在尝试在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) 我正在尝试安装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)
首先,我为非描述性标题道歉.由于我不知道实际发生了什么,所以我无法让它更具体.
现在我的问题.我已经为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) haskell ×8
cabal ×2
ruby ×2
applicative ×1
clamp ×1
coding-style ×1
datamapper ×1
haskell-lens ×1
io-monad ×1
macos ×1
monads ×1
nix ×1
orm ×1
sequel ×1