小编wiz*_*zup的帖子

是(>>)应该丢弃所有左侧输出?

我想我确实理解monad列表然后我发现我不是.这是故事.

给出列表m和功能k

> let m = [1..10]
> :t m
m :: [Integer]

> let k = replicate 2
> :t k
k :: a -> [a]
Run Code Online (Sandbox Code Playgroud)

玩bind >>=会给我的期望

> :t (>>=)
(>>=) :: Monad m => m a -> (a -> m b) -> m b
> :t m >>= k
m >>= k :: [Integer]
> m >>= k
[1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10]
Run Code Online (Sandbox Code Playgroud)

但对于 >>

预期(从IO monad体验,左侧的所有内容都将被丢弃)

m >> m
[1,2,3,4,5,6,7,8,9,10]
Run Code Online (Sandbox Code Playgroud)

拿到

> :t (>>) …
Run Code Online (Sandbox Code Playgroud)

monads haskell list

12
推荐指数
2
解决办法
547
查看次数

关于Haskell中的'pseq'

请考虑以下两个陈述:

(a `par` b) `pseq` (a + b)
Run Code Online (Sandbox Code Playgroud)

a `par` (b `pseq` (a + b))
Run Code Online (Sandbox Code Playgroud)

有人可以解释他们的行为如何彼此不同吗?

对于第一个,如果主线程已完成计算b但火花计算a尚未完成,主线程是否会继续计算a + b

parallel-processing haskell ghc

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

hlint,hdevtools和ghc-mod有什么不同

我正在寻找代码lint,类型查询,自动类型插入和misc帮助器与vim一起使用(如自动完成).

经过一些研究,我找到了多个类似的工具,让我们按照自己的意愿行事

  • hlint
  • hdevtools
  • GHC-MOD

主要问题,这些都是基本相同的工具吗?

当我做一些测试时,我发现只有ghc-mod才能开箱即用(对于代码lint,不会尝试任何Type-helper函数)

$ cat test.hs 
main = putStrLn "test"
$ ghc-mod check test.hs 
test.hs:1:1:Warning: Top-level binding with no type signature: main :: IO ()
$ hdevtools check test.hs 
Run from outside a project, using implicit global project config
$ hlint test.hs 
No hints
Run Code Online (Sandbox Code Playgroud)

我是否需要为hlint和hdevtools创建任何配置文件?

$ hdevtools --version
hdevtools: version 0.1.4.1 (ghc-8.0.1-x86_64-linux, cabal-1.24.0.0)
$ hlint --version
HLint v1.9.35, (C) Neil Mitchell 2006-2016
$ ghc-mod --version
ghc-mod version 5.6.0.0 compiled by GHC 8.0.1
$ ghc --version …
Run Code Online (Sandbox Code Playgroud)

haskell

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

使用reader monad直接传递值有什么好处?

我试图了解何时使用阅读器monad,但我还没有找到一个很好的用法示例.我很确定我对这个主题知之甚少.

考虑这个示例代码:

import Control.Monad.Reader

data Env = Env
         { eInt :: Int
         , eStr :: String
         }

calculateR :: Reader Env Int
calculateR = do
    e <- ask
    return $ eInt e

calculate :: Env -> Int
calculate = eInt

main :: IO ()
main = do
    let env = Env { eInt = 1, eStr = "hello"}
    let a = runReader calculateR env
    let b = calculate env
    print (a,b)
Run Code Online (Sandbox Code Playgroud)

如果我想传遍全局Env以便能够从任何函数访问它,我应该为此目的使用阅读器monad吗?

Env直接传递给函数相比,有什么好处吗?

如果我理解正确的话,无论是calculate和 …

monads haskell

8
推荐指数
2
解决办法
448
查看次数

在NixOS上开始使用purescript需要帮助

我想安装hello world项目,purescriptNixOs和有对夫妇的问题,

  1. 官方 purescript网站建议安装通过,npm但没有nixos.nodePackages.purescript,相反,我找到至少2个变种nixpkgs
    • nixos.purescript
    • nixos.haskellPackages.purescript

有什么不同?

  1. 官方网站推荐pulpbower通过,npm但只有nodePackages.bower可用,并且没有证件psc-package.

应该nix如何处理purescript包?

  1. 官方网站上的示例代码(见下文hello.purs)甚至没有编译,

有这些错误.

$ purs compile hello.purs

Error found:
at hello.purs line 1, column 1 - line 1, column 1

Unable to parse module:
unexpected "import"
expecting "module"
Run Code Online (Sandbox Code Playgroud)

我添加module Hello到代码但仍然失败.

$ purs compile hello.purs 
Error 1 of 2:

  in module Hello
  at hello.purs line …
Run Code Online (Sandbox Code Playgroud)

nixos purescript nix

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

迭代从IO Int创建列表,如何?

我在python挑战中玩链接列表问题,需要查询下一个值(猜测它是Int).

我创建函数以获取下一个值,如下所示

url = "http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=" 

getNext :: Int -> IO Int
getNext x = do
    rsp <- simpleHTTP (getRequest $ url ++ show x)
    bdy <- getResponseBody rsp
    let num = last $ splitWhen (==' ') bdy
    return (read num::Int)
Run Code Online (Sandbox Code Playgroud)

它工作正常(在ghci)

> getNext 12345
44827
> getNext 44827
45439
Run Code Online (Sandbox Code Playgroud)

虽然我想在我找到答案之前反复调用 getNext,但我认为我应该保留历史,就像我在非monadic世界中所做的那样,所以我可以继续使用最后一个值,以防出现故障.

> let nX x = x + 3
> :t nX
nX :: Num a => a -> a
> take 10 $ iterate nX 1 …
Run Code Online (Sandbox Code Playgroud)

io haskell loops list

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

使用nix时不使用stack --nix的原因是什么?

我在,NixOS但我认为这个问题应该适用于任何使用的平台nix

我通过试用发现stack可以与几个选项一起使用来构建项目,但我不完全了解它们之间的区别,

  1. stack
  2. stack --system-ghc
  3. stack --nix

问题

  1. 如果我使用的是nix(在我的情况下为NixOS),我有什么理由不想使用--nix参数吗?
  2. nix处理haskell项目的方式是什么,应该使用cabal(cabal2nix)代替stack
  3. 我发现堆栈正在重建许多已经由安装的库nix,这是什么原因?

nix haskell-stack

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

如何将包添加到 cabal2nix 生成的`env`?

我用这个default.nix来建立我的包nix-build,并获得envnix-shell

{ pkgs ? import <nixpkgs> {} }:
with pkgs;
with haskellPackages;

let
  myPackage = callPackage ./myPackage.nix {};
in
  if lib.inNixShell then myPackage.env else myPackage
Run Code Online (Sandbox Code Playgroud)

myPackage.nix 使用生成 cabal2nix . > myPackage.nix

{ mkDerivation, base, split, stdenv }:
mkDerivation {
  pname = "myPackage";
  version = "0.1.0.0";
  src = ./.;
  isLibrary = false;
  isExecutable = true;
  executableHaskellDepends = [ base split ];
  license = stdenv.lib.licenses.bsd3;
}
Run Code Online (Sandbox Code Playgroud)

这对于构建工作正常,但我想在处理它时添加开发助手工具。我不想编辑myPackage.nix。我想cabal2nix在编辑时重新运行myPackage.cabal

我试着用buildInputs …

haskell cabal nixos nix

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

为什么在do块中需要let关键字?

什么是有原因letdo块.

-- codeblock A
main = do
  let a = 0
  let f a = a + 1
  let b = f 0
  print (a,b)

-- codeblock B
main = do
  a = 0
  f a = a + 1
  b = f 0
  print (a,b)
Run Code Online (Sandbox Code Playgroud)

假设所有let没有in必须遵循=(这是真的吗?)

编译器应该能够意味着let=和预处理/解糖codeblock Bcodeblock A

let在这种情况下使用似乎是不必要的,就像你可以写,codeblock C但选择写codeblock D

-- codeblock C
main = do …
Run Code Online (Sandbox Code Playgroud)

haskell let

4
推荐指数
2
解决办法
531
查看次数

创建记录表单列表的最短方法是什么?

假设我有记录定义

data Zone = Zone
  { zId      :: Int -- this zone's ID
  , zOwnerId :: Int -- the player who owns this zone (-1 otherwise)
  , zPodsP0  :: Int -- player 0's PODs on this zone
  , zPodsP1  :: Int -- player 1's PODs on this zone
  , zPodsP2  :: Int -- player 2's PODs on this zone (always 0 for a two player game)
  , zPodsP3  :: Int -- player 3's PODs on this zone (always 0 for …
Run Code Online (Sandbox Code Playgroud)

haskell record

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

标签 统计

haskell ×8

nix ×3

list ×2

monads ×2

nixos ×2

cabal ×1

ghc ×1

haskell-stack ×1

io ×1

let ×1

loops ×1

parallel-processing ×1

purescript ×1

record ×1