我想我确实理解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) 请考虑以下两个陈述:
(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?
我正在寻找代码lint,类型查询,自动类型插入和misc帮助器与vim一起使用(如自动完成).
经过一些研究,我找到了多个类似的工具,让我们按照自己的意愿行事
主要问题,这些都是基本相同的工具吗?
当我做一些测试时,我发现只有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) 我试图了解何时使用阅读器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和 …
我想安装hello world项目,purescript在NixOs和有对夫妇的问题,
purescript网站建议安装通过,npm但没有nixos.nodePackages.purescript,相反,我找到至少2个变种nixpkgs
有什么不同?
pulp和bower通过,npm但只有nodePackages.bower可用,并且没有证件psc-package.应该nix如何处理purescript包?
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) 我在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) 我在,NixOS但我认为这个问题应该适用于任何使用的平台nix。
我通过试用发现stack可以与几个选项一起使用来构建项目,但我不完全了解它们之间的区别,
stackstack --system-ghcstack --nix问题:
--nix参数吗?nix处理haskell项目的方式是什么,应该使用cabal(cabal2nix)代替stack?nix,这是什么原因?我用这个default.nix来建立我的包nix-build,并获得env与nix-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 …
什么是有原因let的do块.
-- 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 B来codeblock A
let在这种情况下使用似乎是不必要的,就像你可以写,codeblock C但选择写codeblock D
-- codeblock C
main = do …Run Code Online (Sandbox Code Playgroud) 假设我有记录定义
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)