小编Mar*_*ark的帖子

幺半群的实际用途是什么?

我正在读" 了解你一个哈斯克尔",我已经涵盖了应用程序,现在我正在使用幺半群.我对这两者都没有问题,虽然我发现在实践中有用,而monoid却不是这样.所以我想我对Haskell一无所知.

首先,Applicative它说,它创建了类似于统一语法的东西来对'容器'执行各种操作.所以我们可以使用普通函数对Maybe列表执行操作IO(我应该说monad吗?我还不知道monad),函数:

?> :m + Control.Applicative
?> (+) <$> (Just 10) <*> (Just 13)
Just 23
?> (+) <$> [1..5] <*> [1..5]
[2,3,4,5,6,3,4,5,6,7,4,5,6,7,8,5,6,7,8,9,6,7,8,9,10]
?> (++) <$> getLine <*> getLine
one line
 and another one
"one line and another one"
?> (+) <$> (* 7) <*> (+ 7) $ 10
87
Run Code Online (Sandbox Code Playgroud)

因此,applicative是一种抽象.我想我们可以没有它,但它有助于清楚地表达一些想法模式,这很好.

现在,让我们来看看Monoid.它也是抽象而且非常简单.但它对我们有帮助吗?对于书中的每个例子,似乎很明显有更明确的方法来做事:

?> :m + Data.Monoid
?> mempty :: [a]
[]
?> [1..3] `mappend` [4..6]
[1,2,3,4,5,6]
?> [1..3] ++ [4..6] …
Run Code Online (Sandbox Code Playgroud)

haskell monoids

22
推荐指数
4
解决办法
3051
查看次数

安装cider-nrepl

我已经安装了CIDER 0.7.0,现在当我在Emacs(via M-x cider-jack-in RET)中启动时,我收到以下警告:

警告:CIDER的版本(0.7.0)与cider-nrepl的版本(未安装)不匹配

我已经下载了cider-nrepl,发现它包含闭包代码,而不是emacs lisp代码.自从我今天开始探索Clojure世界,并且项目页面上没有安装说明,你能告诉我如何安装cider-nrepl?

lisp emacs clojure cider read-eval-print-loop

20
推荐指数
1
解决办法
5682
查看次数

如何使git工作通过tor推送到GitHub的提交?

因此,GitHub现在被俄罗斯政府和Rospotrebnadzor正式禁止.我使用GitHub创建自由软件并分享它,这是我生活中重要的一部分.

今天我在Arch Linux上安装了Tor,现在我可以浏览GitHub和其他被禁网站了.我试图git通过Tor做作,但没有成功.

这是我做的:

git config --global http.proxy localhost:9050
git config --global https.proxy localhost:9050
Run Code Online (Sandbox Code Playgroud)

但是当我试图推动时,我得到错误501:

致命:无法访问' https://X@github.com/X/X.git/ ':在CONNECT之后从代理收到HTTP代码501

所以,501意味着"没有实施".我对Tor没什么经验(但从现在开始我开始欣赏它),所以不知道用这种方式使用Tor是否真的不可能,或者我做错了.

问:如何配置git通过Tor使用它?

git github tor

19
推荐指数
1
解决办法
2891
查看次数

为什么Parsec的uncons显式内联Text而不是ByteString?

被秒差距使用的抽象层,类型的类Stream,它看起来像这样:

class (Monad m, ShowToken t) => Stream s m t | s -> t where
  uncons :: s -> m (Maybe (t, s))

instance (Monad m, ShowToken t) => Stream [t] m t where
  uncons []     = return Nothing
  uncons (t:ts) = return $ Just (t, ts)
  {-# INLINE uncons #-}

instance Monad m => Stream CL.ByteString m Char where
  uncons = return . CL.uncons

instance Monad m => Stream C.ByteString m Char where
  uncons = …
Run Code Online (Sandbox Code Playgroud)

haskell inline

14
推荐指数
1
解决办法
193
查看次数

有没有办法在包的源代码中获得Cabal包的版本?

假设我有一个控制台程序,可以选择显示其版本.目前每当我更新.cabal文件中的版本时,我都需要转到源代码并更新常量 - 当前版本号的字符串表示.这感觉不符合DRY原则,现在我想知道,是否有可能.cabal从源代码中获取文件中定义的项目版本 ?也许Cabal定义了一些CPP宏或其他东西?

haskell cabal

13
推荐指数
1
解决办法
509
查看次数

Haskell中的函数应用程序

好吧,这是漫长的一天,我的大脑可能无法在Haskell级别上运行,但我无法理解"了解你一个Haskell"中的一个例子.

该部分称为带有$的函数应用程序,并且有一个如何$定义的示例:

($) :: (a -> b) -> a -> b
f $ x = f x
Run Code Online (Sandbox Code Playgroud)

到目前为止一切都很清楚.我理解本节中的所有示例,除了最后一个:

ghci> map ($ 3) [(4+), (10*), (^2), sqrt]
[7.0,30.0,9.0,1.7320508075688772]
Run Code Online (Sandbox Code Playgroud)

这里我们映射($ 3)函数列表并获得这些函数的应用结果3.但这怎么可能呢?

从第一个代码片段可以看出,第一个参数是一个函数,我们甚至可以写:

*Main> ($) sqrt 4
2.0
Run Code Online (Sandbox Code Playgroud)

现在($ 3)是功能的部分应用$,但3继续功能的位置!所以3应该是一个功能还是什么?

还有另一个谜团:到底是(4+)什么?我知道这(+4)是部分应用功能+,所以(4+)应该部分应用功能4吗?废话.什么样的伎俩在这里有效?

haskell function operators partial-application operator-sections

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

如何在IO monad中正确强制评估纯值?

我需要在IOmonad中强制评估纯值.我正在为C绑定编写更高级别的接口.在较低的层次上,我有newFile 功能和freeFile功能.newFile返回我在低级别定义的一些id,不透明对象.你基本上不能做任何事情,但是用它来释放文件纯粹计算与该文件相关的东西.

所以,我有(简化):

execGetter :: FilePath -> TagGetter a -> IO a
execGetter path g = do
  fid <- newFile path -- ‘fid’ stands for “file id”
  let x = runGetter g fid
  freeFile fid
  return x
Run Code Online (Sandbox Code Playgroud)

这是该函数的初始版本.我们需要xfreeFile调用之前 进行计算.(代码有效,如果我删除freeFile它一切都很好,但我想释放资源,你知道.)

第一次尝试(我们将用于seq"强制"评估):

execGetter :: FilePath -> TagGetter a -> IO a
execGetter path g = do
  fid <- newFile path
  let x = runGetter g …
Run Code Online (Sandbox Code Playgroud)

haskell lazy-evaluation

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

"bracket(mallocBytes n)free"和"allocaBytes"之间有什么区别?

如果你想要背景,请看这里.简而言之,问题是:" 从bracket (mallocBytes n) free和之间的实际差异是什么".allocaBytesForeign.Marshall.Alloc

通常在C中,alloca在堆栈malloc上分配并在堆上分配.我不确定在Haskell中它发生了什么,但我不希望上述方程式与速度之外的区别.如果你点击后台链接,你知道编译代码bracket (mallocBytes n) free导致"双重免费或腐败",同时allocaBytes工作正常(在GHCi中根本无法看到问题,在这两种情况下一切正常).

到现在为止,我已经花了两天时间进行痛苦的调试,而且我非常有信心bracket (mallocBytes n) free在某种程度上不稳定,其余的代码都是可靠的.我想知道这是什么交易bracket (mallocBytes n) free.

haskell ffi

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

有没有办法为类型类方法制作Haddock渲染每个参数的文档?

事实证明,Haddock不为类型类方法呈现每个参数的文档:

class Foo a where

  foo
    :: Int -- ^ This string will be ignored by Haddock
    -> a
Run Code Online (Sandbox Code Playgroud)

这会给我维护的库的用户带来某些问题,因为我的方法中的方法有很长的签名.我总是把源代码格式化的描述(当然适用于普通函数),但事实证明Haddock不会显示它们(也不会抱怨它们).

有没有办法用Haddock显示每个参数的文档?也许有些解决方法?

haskell haddock

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

如何修改具有任意功能的地方

有时我们需要修改一个地方,但这里没有符合我们需求的内置功能.

例如,这里是incfdecf加法和减法:

CL-USER> (defvar *x* 5)
*X*
CL-USER> (incf *x* 3)
8
CL-USER> *x*
8
CL-USER> (decf *x* 10)
-2
CL-USER> *x*
-2
Run Code Online (Sandbox Code Playgroud)

但乘法和除法怎么样?如果我们希望修改具有任意功能的地方,如下所示:

(xf (lambda (x) ...) *x*)
Run Code Online (Sandbox Code Playgroud)

xf 实用程序非常有用,特别是当我们必须处理深层嵌套结构时:

(my-accessor (aref (cdr *my-data*) n))
Run Code Online (Sandbox Code Playgroud)

lisp macros common-lisp variable-assignment

7
推荐指数
2
解决办法
184
查看次数