小编ama*_*loy的帖子

STM并改变clojure

我正在编写"Clojure编程"一书.在解释alter和STM时,他们说如果在更改期间,Clojure检测到来自事务外部的ref的更改,它将使用新值重新运行事务.如果是这种情况,我会想象你传递的更新函数需要是纯粹的,但是文档中没有指出(并且它在其他类似的情况下).

我的假设是正确的吗?如果没有,STM如何重新应用该功能?如果它是正确的,那么您是否可以依靠文档告诉您何时可以产生副作用,何时不能?

clojure stm

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

如何在Haskell中编写自定义的show函数

我正在定义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)

enums haskell

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

为什么Clojure的每次通话时的gensym增加3?

对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)

我已经看到和理解的结合使用的atominc,但我是新来的gensym功能.

clojure

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

按箭头键在Clojure控制台中无法正常工作

我下载了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位.

如何恢复正常的箭头键行为?

clojure

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

编辑列表中的每个第N个项目

我想在每n个位置对整数列表执行算术运算(例如,将值加倍).

例如,给定列表[1,2,3,4,5,6,7],我想每三个位置加倍值.在那种情况下,我们会[1,2,6,4,5,12,7].

我该怎么做?

haskell list

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

为什么`\ x - > fxx` =`加入f`?

我最近发现了自由\x -> f x xjoin f,并且想要了解原因.我从这里开始:

join :: Monad m => m (m a) -> m a
Run Code Online (Sandbox Code Playgroud)

因为我不熟悉"函数monad"而感到难过.有人可以帮助我解释平等的类型推导吗?

monads haskell function

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

JVM 语言中如何编译嵌套函数和词法作用域?

作为我的问题的一个具体示例,这是 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 提升?还有什么?

对不起,如果这是以前被问过的问题;似乎必须如此,但我还没有发现任何正确的地方。

scala clojure jvm-languages kotlin

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

如果存在,则合并两个 Just 值,否则先返回 Just

我想要一种更短的方法来编写这段代码,因为它将在我正在开发的项目的多个地方使用。是否有一个我可以使用的库可以满足我的特定需求?

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)

haskell option-type

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

我是否重新发明了(方形)轮子?

我们应该知道,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)

macros clojure map

3
推荐指数
2
解决办法
291
查看次数

Clojure:如何开启Java类的Case

我在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)

java clojure

3
推荐指数
1
解决办法
858
查看次数

标签 统计

clojure ×6

haskell ×4

enums ×1

function ×1

java ×1

jvm-languages ×1

kotlin ×1

list ×1

macros ×1

map ×1

monads ×1

option-type ×1

scala ×1

stm ×1