我想在dhall中表示IPv4地址,因此我可以管理我的主机配置.
默认情况下,它保持为Text; 但这显然不能令人满意,因为它允许任何旧文本漏掉.我想将这些值保持为8位值的4元组.
我不认为Dhall本身可以允许这种情况 - 我能看到的最接近的是{a:Natural,b:Natural}等的记录,但这在语法上是笨重的,并且仍然允许在0-255之外的八位字节值.
假设我无法直接在Dhall中实现这一点,也许我可以在Haskell中定义一个类型,它可以自动从Dhall中读取4个长度的Naturals列表,
我的问题是:
Interpret; 如果是这样,我如何定义一个将在4部分的整数列表中读取的实例,同时为错误构造的错误长度列表(错误长度的列表,非整数列表或非列表)或out -of-bounds值(不在0和255之间的整数).这就是我尝试过的:
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE RecordWildCards #-}
import Control.Applicative ( empty, pure )
import Dhall ( Generic, Interpret( autoWith ), Type( Type, extract, expected ) )
import Dhall.Core ( Expr( Natural, NaturalLit ) )
import Data.Word ( Word8 )
newtype IP = IP (Word8, Word8, Word8, Word8)
deriving Generic
word8 :: Type Word8
word8 = Type {..}
where
extract (NaturalLit n) | n >= …Run Code Online (Sandbox Code Playgroud) 我有一个类,SeqNE代表非空序列:
newtype SeqNE ? = SeqNE { unSeqNE ? NonNull (Seq ?) }
deriving Eq
type instance Element (SeqNE ?) = ?
Run Code Online (Sandbox Code Playgroud)
whereNonNull来自 Michael Snoyman 的mono-traversable包,Sequence来自容器包。
我有一个(unicode)模式来(分解)组合SeqNE实例:
infixl 5 :?
{- | (de)compose a `SeqNE ?` from a `Seq ?` and an `?` (rightwards) -}
pattern (:?) ? Seq ? -> ? -> SeqNE ?
pattern xs :? x <- (unsnoc -> (xs,x))
where xs :? x = …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用nix-shell作为#!runghc的包装器,如联机帮助页中所示.但它找不到图书馆.给出以下示例,从联机帮助页中删除
#! /usr/bin/env nix-shell
#! nix-shell -i runghc -p haskellPackages.HTTP
import Network.HTTP
main = return ()
Run Code Online (Sandbox Code Playgroud)
我得到以下结果:
[~:0]$ ./nixshelltest
nixshelltest:4:1: error:
Failed to load interface for ‘Network.HTTP’
Use -v to see a list of the files searched for.
[~:1]$
Run Code Online (Sandbox Code Playgroud)
在我看来,这正是nix-shell -p要避免的.
我做错了什么,错过了重点,还是有错误?这是在nixOS 17.03主机上,也是在Ubuntu上运行nix 17.09的主机.
谢谢,
我试图通过附加一个数字来找到目录名,直到找到一个尚不存在的名称:
head <$> filterM (fmap not . fexists_) [ getDatedDir t d n | n <- [0..] ]
Run Code Online (Sandbox Code Playgroud)
这个问题是它永远不会回来.我认为问题是尽管IO是一个Functor,但filterM必须在头部效果之前完成所有IO; 也就是说,它必须为每个n评估fexists - 这当然是无限的.
现在,我可以解决这个问题:
go t d 0
where go t d n = do
let dir = getDatedDir t d n
fexists_ dir >>= \case
False -> return dir
True -> go t d (n+1)
Run Code Online (Sandbox Code Playgroud)
但我觉得应该有更优雅的方法,使用filterM或类似的东西.
这感觉就像一个普通的模式,在Control.Monad中可能存在一个提升功能,我只是没有看到它.
我正在尝试在 nix 中全局覆盖 python 包(uvloop),以便黑色看到覆盖。
uvloop(python 包)测试对我来说失败了,因为我在防火墙后面工作。我可以通过直接编辑 nixpkgs 推导来构建使用 uvloop 的东西(呃)来设置doCheck = false.
我试图在覆盖层中对其进行编码,但没有成功 - 覆盖层被读取(例如,语法错误导致失败),但我在覆盖层中所做的任何事情都没有真正阻止测试运行。
我尝试遵循https://nixos.wiki/wiki/Overlays、https://nixos.org/manual/nixpkgs/stable/#how-to-override-a-python-package-using-overlays和如何将自定义 python 与现有包一起使用 - nix 派生?(使用 packageOverrides 覆盖 python;使用 pythonOverrides;以及使用和不使用 overridePythonAttrs);适用于 python3 和 python39;但没有成功。
例如,
self: super: {
python3 = super.python3.override {
packageOverrides = pyself: pysuper: {
uvloop = pysuper.uvloop.overrideAttrs (_: {
doCheck = false;
});
};
};
}
Run Code Online (Sandbox Code Playgroud)
为了奖励积分,我想为 python 包 uvloop 的所有实例实现这一点 - 不仅仅是 3.9 中的实例 - 但我会寻求任何我能得到的帮助。
谢谢,
Control.Applicative.optional允许处理零个或一个Applicatives.许多和一些分别允许0或更多,或1或更多.我想创建一个处理零,一或两个的函数,具体来说.签名可以是许多/一些,即
zeroOneOrTwo :: Alternative f => f a -> f [a]
Run Code Online (Sandbox Code Playgroud)
我觉得这应该是非常简单的,但我已经玩了一段时间并且无法使它工作.任何指针都将非常感激.
我正在尝试在NixOS上使用liquidhaskell.我可以安装包(liquidhaskell-0.8.2.3),虽然不是cabal集成,因为它需要cabal 1.18-1.25,但我有cabal 2.0.1.0.
我已经安装了liquidhaskell软件包作为ghc-with-packages设置的一部分:
[~:0]$ readlink $( type -p liquid )
/nix/store/pdbzl0p6k1klmajx969b6vvwyw9w0s6b-ghc-8.2.2-with-packages/bin/liquid
Run Code Online (Sandbox Code Playgroud)
在许多其他方面,包文本也安装在这个集合中:
[proclib:1]$ ls -ld /nix/store/pdbzl0p6k1klmajx969b6vvwyw9w0s6b-ghc-8.2.2-with-packages/lib/ghc-8.2.2/text-1.2.2.2/
dr-xr-xr-x 3 root root 68 Jan 1 1970 /nix/store/pdbzl0p6k1klmajx969b6vvwyw9w0s6b-ghc-8.2.2-with-packages/lib/ghc-8.2.2/text-1.2.2.2/
Run Code Online (Sandbox Code Playgroud)
但是液体看不出来:
[proclib:1]$ liquid ~/bin/h/nix.hs
LiquidHaskell Version 0.8.2.3
Copyright 2013-18 Regents of the University of California. All Rights Reserved.
liquid: Main: Could not find module ‘Data.Text’
Perhaps you meant Data.Set (from containers-0.5.10.2)
Use -v to see a list of the files searched for.
Run Code Online (Sandbox Code Playgroud)
以上不是cabal包的一部分(试图从等式中消除阴谋).
我尝试过使用nix-shell来完成这项工作,但无论是nix-shell还是液体都会破坏语言编译指示:
[~:0]$ nix-shell -p myHaskellEnv --run liquid ~/bin/h/nix.hs
/nix/store/q1cwqhb6v8yx8vy4s5p6sxrq8s0bnqmy-nix.hs: line 5: …Run Code Online (Sandbox Code Playgroud) 我正在XMonad作为窗口管理器,试图在ubuntu上使用nix。我可以在使用nixOS的一台主机上很好地工作,但是我还没有第二台设备可用于nixOS。在Ubuntu之上的nix在那里通常可以很好地工作,但是xmonad无法找到贡献性库。
相关软件包已安装:
$ nix-env -q | grep xmonad
xmonad-0.13
xmonad-contrib-0.13
xmonad-extras-0.12.1
Run Code Online (Sandbox Code Playgroud)
但是重新编译我的xmonad.hs,它找不到contrib库:
$ xmonad --recompile
Error detected while loading xmonad configuration file: /home/martyn/.xmonad/xmonad.hs
xmonad.hs:32:1: error:
Failed to load interface for ‘XMonad.Layout.NoBorders’
Use -v to see a list of the files searched for.
...
Please check the file for errors.
Run Code Online (Sandbox Code Playgroud)
相关文件已安装:
$ ls /nix/store/*xmonad-contrib*/lib/**/NoBorders*
/nix/store/4xrrwsm6362xkn9jn1b17kd891kv9z3a-xmonad-contrib-0.13/lib/ghc-8.0.2/xmonad-contrib-0.13/XMonad/Actions/NoBorders.dyn_hi
/nix/store/4xrrwsm6362xkn9jn1b17kd891kv9z3a-xmonad-contrib-0.13/lib/ghc-8.0.2/xmonad-contrib-0.13/XMonad/Actions/NoBorders.hi
/nix/store/4xrrwsm6362xkn9jn1b17kd891kv9z3a-xmonad-contrib-0.13/lib/ghc-8.0.2/xmonad-contrib-0.13/XMonad/Layout/NoBorders.dyn_hi
/nix/store/4xrrwsm6362xkn9jn1b17kd891kv9z3a-xmonad-contrib-0.13/lib/ghc-8.0.2/xmonad-contrib-0.13/XMonad/Layout/NoBorders.hi
Run Code Online (Sandbox Code Playgroud)
通过将xmonad-contrib添加到我的nixpkgs config.nix中,我将这些库添加到了ghc软件包注册表中:
$ cat ~/.config/nixpkgs/config.nix
with (import <nixpkgs> {});
{
packageOverrides = pkgs: with pkgs; {
myHaskellEnv = pkgs.haskellPackages.ghcWithPackages (haskellPackages: with haskellPackages; [ …Run Code Online (Sandbox Code Playgroud) 我希望编写一些Haskell,它将Haskell作为其工作的一部分。并将其安装在nixOS主机上。我不想将可执行文件放在我的PATH中(并且依赖于它会破坏nix的美观依赖模型)。
例如,如果这是一个Perl脚本,我将拥有一个简单的构建器,该构建器将根据.nix文件中声明的依赖关系查找某种格式的字符串,并将其替换为可执行文件名称。但这对于haskell常见的基于阴谋的建筑似乎有些困难。
在nix上的Haskell代码中,是否存在用于在构建时(包括在开发期间以及在安装时)对可执行文件的路径进行编码的标准用法?
为了举一个具体的例子,下面是一个简单的“脚本”:
import System.Process ( readProcess )
main = do
stdout <- readProcess "hostname" [] ""
putStrLn $ "Hostname: " ++ stdout
Run Code Online (Sandbox Code Playgroud)
我希望能够编译该程序(原则上)而不依赖于PATH中的主机名,而是用完整的/ nix / store / -inetutils- / bin / hostname路径替换主机名,从而也能获得收益nix下的依赖管理。
这可以通过使用shell(或类似的)脚本来管理,该脚本使用如上定义的替换方案构建,该脚本设置haskell可执行文件期望的环境。但是仍然需要通过cabal.mkDerivation进行一些引导,并且由于我是OptParse-Applicative的bash完成的爱好者,所以我不愿意通过每次按下Tab键启动另一个脚本来降低它的速度。但是,如果需要的话,就足够公平了。
我确实通过cabal.mkDerivation进行了某种预构建步骤,但是如果在那儿我看不到它。
谢谢,
我想在 NixOS 下运行一个预构建的 docker 容器。我想以尼克斯式的方式做到这一点:
/etc/nixos/configuration.nix通过在 中(间接)嵌入表达式(可能是通过服务)从启动运行容器systemd,从而以声明方式配置它。我找到了一些关于从 nix 内部构建docker 容器的页面,尽管我什至无法让示例 4在这里工作。但我还没有找到任何通过系统声明运行容器的示例。
我真的很感谢这里的一些帮助或指示(或示例!),我正在努力让东西工作。我对 docker 的了解只是一时的了解。
我有一个“月”类型,大致是
\n\nnewtype Month = Month Word8\nRun Code Online (Sandbox Code Playgroud)\n\nMonth构造函数未导出的地方;相反,一个函数
mon :: Word8 -> Maybe Month\nmon i = if i > 0 && i < 13\n then Just $ Month i\n else Nothing\nRun Code Online (Sandbox Code Playgroud)\n\n被导出,仅当输入值在 1 和 12 之间(含 1 和 12)时才会返回一个值。
\n\n现在,使用Language.Haskell.TH.Quote,我定义了一个准引用 ... 运算符?...这允许我“在编译时”“创建” Month 的实例:
month :: QuasiQuoter\nmonth = QuasiQuoter { quoteDec = error "quoteDec not implemented"\n , quoteType = error "quoteType not implemented"\n , quotePat = "quotePat not implemented"\n , quoteExp = …Run Code Online (Sandbox Code Playgroud) 我想在 nixos 主机上运行 ftp 服务器。我正在使用 vsftpd,不过如果可以的话可以使用其他东西。
ftp 在本地主机上工作正常,但防火墙阻止我进行远程使用。我已允许 TCP 端口 21,但这还不够。
我应该如何配置防火墙以允许 ftp 连接(包括写入 ftp 服务器)?
这是我目前拥有的代码:
{
networking.firewall = { allowedTCPPorts = [ 20 21 ];
# connectionTrackingModules = [ "ftp" ];
};
services.vsftpd = {
enable = true;
# cannot chroot && write
# chrootlocalUser = true;
writeEnable = true;
localUsers = true;
userlist = [ "martyn" "cam" ];
userlistEnable = true;
};
}
Run Code Online (Sandbox Code Playgroud)
通过上述操作,任何从脱离主机使用 ftp 的操作都会失败:
ftp> put dead.letter
200 PORT command successful. Consider using PASV.
425 …Run Code Online (Sandbox Code Playgroud) haskell ×9
nix ×4
nixos ×4
ghc ×2
applicative ×1
dhall ×1
docker ×1
executable ×1
firewall ×1
ftp ×1
monads ×1
python ×1
quasiquotes ×1
vsftpd ×1
xmonad ×1