我正在编写"Clojure编程"一书.在解释alter和STM时,他们说如果在更改期间,Clojure检测到来自事务外部的ref的更改,它将使用新值重新运行事务.如果是这种情况,我会想象你传递的更新函数需要是纯粹的,但是文档中没有指出(并且它在其他类似的情况下).
我的假设是正确的吗?如果没有,STM如何重新应用该功能?如果它是正确的,那么您是否可以依靠文档告诉您何时可以产生副作用,何时不能?
我正在定义Octave类型:
data Octave = 1 | 2 | 3
deriving (Show, Read, Ord, Enum)
Run Code Online (Sandbox Code Playgroud)
由于'1'对数据构造函数标识符无效,我必须这样做:
data Octave = O1 | O2 | O3
deriving (Show, Eq, Read, Ord, Enum)
Run Code Online (Sandbox Code Playgroud)
现在,如果我show Octave O1显示"O1",这不是我想要的.我希望结果为"1".我知道我们可以像这样定制我们的Show行为:
instance Show Blabla where
show (Blabla ints chars list num) =
"integers = " ++ show ints ++ "\n"
Run Code Online (Sandbox Code Playgroud)
但问题是我使用的是枚举类型,这意味着除了标识符名称'O1'之外它没有值.我怎样才能在Haskell中访问它?
另一个问题:我怎么读回来?
read "O1" :: Octave 工作,但我想 read "1" :: Octave
instance Read Octave where
read "1" = O1
read "2" = O2
read "3" = O3 …Run Code Online (Sandbox Code Playgroud) 对lisps相当新,但在查看顺序整数生成代码时,我注意到重复调用(gensym)会使前缀后面提供的数字增加3.我很好奇为什么会这样.
user=> (gensym)
G__662
user=> (gensym)
G__665
user=> (gensym)
G__668
user=> (gensym)
G__671
user=> (gensym)
G__674
user=> (gensym)
G__677
Run Code Online (Sandbox Code Playgroud)
我已经看到和理解的结合使用的atom和inc,但我是新来的gensym功能.
我下载了Clojure jar.它的版本是1.6.0.当我在控制台中运行的Clojure我按箭头键,但他们不移动光标,但产生这些字符"[[d ^ [[C .
我使用这个命令启动Clojure:
java -cp clojure-1.6.0.jar clojure.main
Run Code Online (Sandbox Code Playgroud)
在Ubuntu 14.04 LTS 64位上使用Java 1.7.0_55 64位.
如何恢复正常的箭头键行为?
我想在每n个位置对整数列表执行算术运算(例如,将值加倍).
例如,给定列表[1,2,3,4,5,6,7],我想每三个位置加倍值.在那种情况下,我们会[1,2,6,4,5,12,7].
我该怎么做?
我最近发现了自由\x -> f x x点join f,并且想要了解原因.我从这里开始:
join :: Monad m => m (m a) -> m a
Run Code Online (Sandbox Code Playgroud)
因为我不熟悉"函数monad"而感到难过.有人可以帮助我解释平等的类型推导吗?
作为我的问题的一个具体示例,这是 Python 中的一个片段(它应该对最广泛的人可读,并且无论如何都有一个 JVM 实现):
def memo(f):
cache = {}
def g(*args):
if args not in cache:
cache[args] = f(*args)
return cache[args]
return g
Run Code Online (Sandbox Code Playgroud)
工业级语言如何编译这样的定义,以实现静态作用域?如果我们只有嵌套定义但没有更高阶的函数值参数或返回值,像 Pascal 那样(因此不需要闭包)怎么办?我猜计算静态链接已经过时了,因为您无法访问方法调用的堆栈帧。那么一般是怎么做的呢?他们构建匿名内部类吗?Lambda 提升?还有什么?
对不起,如果这是以前被问过的问题;似乎必须如此,但我还没有发现任何正确的地方。
我想要一种更短的方法来编写这段代码,因为它将在我正在开发的项目的多个地方使用。是否有一个我可以使用的库可以满足我的特定需求?
case mbData1, mbData2 of
(Just data1, Just data2) -> Just $ mergeData data1 data2
(Nothing, Just data2) -> Just data2
(Just data1, Nothing) -> Just data1
(Nothing, Nothing) -> Nothing
Run Code Online (Sandbox Code Playgroud) 我们应该知道,Clojure map可以应用于一个序列:
(map #(* %1 %1) [1 2 3]) ; (1)
Run Code Online (Sandbox Code Playgroud)
..或多个,以这种方式:
(map vector [0 1] [2 1]) ; (2)
;=> ([0 2] [1 1])
Run Code Online (Sandbox Code Playgroud)
现在我想获得与(2)相同的结果,但我将参数存储在序列中.换句话说,以下内容未给出所需的结果:
(map vector [[0 1] [2 1]]) ; (3)
;=> ([[0 1]] [[2 1]])
Run Code Online (Sandbox Code Playgroud)
所以我写了这个简单的宏,其中umap代表"unsplice map":
(defmacro umap [fun args-list]
"umap stands for unspliced map.
Let args-list be a list of args [a1 a2 ... an].
umap is the same of (map fun a1 a2 .. an)"
`(map ~fun ~@args-list))
Run Code Online (Sandbox Code Playgroud)
显然它就像一个魅力:
(umap vector [[0 …Run Code Online (Sandbox Code Playgroud) 我在clojure中有一个java类,它来自一个返回类的方法.我想要打开这些,如下:
(case type
java.lang.String (println "Found String" name)
java.lang.Long (println "Found Long" name)
java.nio.ByteBuffer (println "Found ByteBuffer" name)
java.lang.Boolean (println "Found Boolean" name)
java.math.BigDecimal (println "Found BigDecimal" name)
java.lang.Double (println "Found Double" name)
java.lang.Float (println "Found Float" name)
java.net.InetAddress (println "Found InetAddress" name)
java.lang.Integer (println "Found Integer" name)
java.util.Date (println "Found Date" name)
java.util.UUID (println "Found UUID" name)
java.math.BigInteger (println "Found BigInteger" name)
java.util.List (println "Found List" name)
java.util.Set (println "Found Set" name)
java.util.Map (println "Found Map" name))
Run Code Online (Sandbox Code Playgroud)
但是,当我运行这个时,我得到了
java.lang.IllegalArgumentException: …Run Code Online (Sandbox Code Playgroud)