我正在读" 了解你一个哈斯克尔",我已经涵盖了应用程序,现在我正在使用幺半群.我对这两者都没有问题,虽然我发现在实践中有用,而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) 我已经安装了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?
因此,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使用它?
有被秒差距使用的抽象层,类型的类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) 假设我有一个控制台程序,可以选择显示其版本.目前每当我更新.cabal文件中的版本时,我都需要转到源代码并更新常量 - 当前版本号的字符串表示.这感觉不符合DRY原则,现在我想知道,是否有可能.cabal从源代码中获取文件中定义的项目版本
?也许Cabal定义了一些CPP宏或其他东西?
好吧,这是漫长的一天,我的大脑可能无法在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
我需要在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)
这是该函数的初始版本.我们需要x在freeFile调用之前
进行计算.(代码有效,如果我删除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) 如果你想要背景,请看这里.简而言之,问题是:" 从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.
事实证明,Haddock不为类型类方法呈现每个参数的文档:
class Foo a where
foo
:: Int -- ^ This string will be ignored by Haddock
-> a
Run Code Online (Sandbox Code Playgroud)
这会给我维护的库的用户带来某些问题,因为我的方法中的方法有很长的签名.我总是把源代码格式化的描述(当然适用于普通函数),但事实证明Haddock不会显示它们(也不会抱怨它们).
有没有办法用Haddock显示每个参数的文档?也许有些解决方法?
有时我们需要修改一个地方,但这里没有符合我们需求的内置功能.
例如,这里是incf和decf加法和减法:
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)