小编use*_*536的帖子

我如何代表dhall中的元组?

我想在dhall中表示IPv4地址,因此我可以管理我的主机配置.

默认情况下,它保持为Text; 但这显然不能令人满意,因为它允许任何旧文本漏掉.我想将这些值保持为8位值的4元组.

我不认为Dhall本身可以允许这种情况 - 我能看到的最接近的是{a:Natural,b:Natural}等的记录,但这在语法上是笨重的,并且仍然允许在0-255之外的八位字节值.

假设我无法直接在Dhall中实现这一点,也许我可以在Haskell中定义一个类型,它可以自动从Dhall中读取4个长度的Naturals列表,

我的问题是:

  1. 我是否认为直接在Dhall中这样做是不可能或不成比例的?
  2. 要在Haskell中定义此类型,我是否要定义一个实例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)

haskell dhall

10
推荐指数
1
解决办法
238
查看次数

Haskell、PatternSynonyms、COMPLETE pragma 和视图模式

我有一个类,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)

haskell ghc

9
推荐指数
0
解决办法
214
查看次数

nix-shell为#!runghc的翻译

我正在尝试使用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的主机.

谢谢,

haskell nix

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

如何使用带有无限列表的filterM

我试图通过附加一个数字来找到目录名,直到找到一个尚不存在的名称:

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中可能存在一个提升功能,我只是没有看到它.

monads haskell

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

如何在nix中全局覆盖pythonPackage

我正在尝试在 nix 中全局覆盖 python 包(uvloop),以便黑色看到覆盖。

uvloop(python 包)测试对我来说失败了,因为我在防火墙后面工作。我可以通过直接编辑 nixpkgs 推导来构建使用 uvloop 的东西(呃)来设置doCheck = false.

我试图在覆盖层中对其进行编码,但没有成功 - 覆盖层被读取(例如,语法错误导致失败),但我在覆盖层中所做的任何事情都没有真正阻止测试运行。

我尝试遵循https://nixos.wiki/wiki/Overlayshttps://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 中的实例 - 但我会寻求任何我能得到的帮助。

谢谢,

python nix

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

Haskell:如何创建一个不允许,一个或两个Applicatives的函数?

Control.Applicative.optional允许处理零个或一个Applicatives.许多和一些分别允许0或更多,或1或更多.我想创建一个处理零,一或两个的函数,具体来说.签名可以是许多/一些,即

zeroOneOrTwo :: Alternative f => f a -> f [a]
Run Code Online (Sandbox Code Playgroud)

我觉得这应该是非常简单的,但我已经玩了一段时间并且无法使它工作.任何指针都将非常感激.

haskell applicative

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

有没有人能够将liquidhaskell与nixos整合?

我正在尝试在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)

haskell nixos liquid-haskell

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

Nix上的XMonad-找不到xmonad-contrib

我正在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 xmonad ghc nix

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

如何在Nix上从Haskell在Nix上调用可执行文件

我希望编写一些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进行了某种预构建步骤,但是如果在那儿我看不到它。

谢谢,

executable haskell nixos nix

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

如何在 nixos 下启动时运行 docker 容器

我想在 NixOS 下运行一个预构建的 docker 容器。我想以尼克斯式的方式做到这一点:

  1. 通过 nix 表达式从 docker hub 本身安装容器,因此是可重现的。docker 目前被列为“最新”,我希望有某种方法可以从该版本转换为版本 ID。
  2. /etc/nixos/configuration.nix通过在 中(间接)嵌入表达式(可能是通过服务)从启动运行容器systemd,从而以声明方式配置它。

我找到了一些关于从 nix 内部构建docker 容器的页面,尽管我什至无法让示例 4在这里工作。但我还没有找到任何通过系统声明运行容器的示例。

我真的很感谢这里的一些帮助或指示(或示例!),我正在努力让东西工作。我对 docker 的了解只是一时的了解。

docker nixos

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

Haskell:使准引用值严格/在编译时评估

我有一个“月”类型,大致是

\n\n
newtype Month = Month Word8\n
Run Code Online (Sandbox Code Playgroud)\n\n

Month构造函数未导出的地方;相反,一个函数

\n\n
mon :: Word8 -> Maybe Month\nmon i = if i > 0 && i < 13\n        then Just $ Month i\n        else Nothing\n
Run Code Online (Sandbox Code Playgroud)\n\n

被导出,仅当输入值在 1 和 12 之间(含 1 和 12)时才会返回一个值。

\n\n

现在,使用Language.Haskell.TH.Quote,我定义了一个准引用 ... 运算符?...这允许我“在编译时”“创建” Month 的实例:

\n\n
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)

haskell lazy-evaluation template-haskell quasiquotes

4
推荐指数
1
解决办法
275
查看次数

在 nixos 上运行 ftp 服务器

我想在 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)

ftp firewall nixos vsftpd

3
推荐指数
1
解决办法
2401
查看次数