我在Compojure开发的Clojure中有两个不同的Web应用程序.每个使用defroutes来创建它的处理程序.
如何将两种不同的defroutes定义组合成一个defroute?我想将第一个应用程序的路由重用到第二个应用程序.
我有一个调用的Scala项目scala-playground,我用sbt ensimeConfig和生成了Ensime的配置sbt ensimeConfigProject.
当M-x ensime从项目的缓冲区运行时,我可以在Emacs状态栏中看到Ensime已连接:它显示Scala[scala-playground].
在运行项目时C-c C-b r,在主目录中启动一个新的sbt实例,$HOME/project创建一个目录而不是项目目录并失败:
[info] Loading project definition from /home/user/project
[info] Set current project to user (in build file:/home/user/)
[info] sbt server started at 127.0.0.1:4766
sbt:user>
sbt:user> run
[error] java.lang.RuntimeException: No main class detected.
[error] at scala.sys.package$.error(package.scala:27)
[error] at sbt.Defaults$.$anonfun$runTask$4(Defaults.scala:1199)
[error] at scala.Option.getOrElse(Option.scala:121)
[error] at sbt.Defaults$.$anonfun$runTask$3(Defaults.scala:1199)
[error] at sbt.Defaults$.$anonfun$runTask$3$adapted(Defaults.scala:1198)
[error] at scala.Function1.$anonfun$compose$1(Function1.scala:44)
[error] at sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:42)
[error] at sbt.std.Transform$$anon$4.work(System.scala:64)
[error] at sbt.Execute.$anonfun$submit$2(Execute.scala:257)
[error] …Run Code Online (Sandbox Code Playgroud) 我发现Clojure的行为混淆了地图和记录之间的平等.在第一个例子中,我们有两种结构相同的不同类型.equality =函数返回true:
user> (defn make-one-map
[]
{:a "a" :b "b"})
#'user/make-one-map
user> (def m1 (make-one-map))
#'user/m1
user> m1
{:a "a", :b "b"}
user> (def m2 {:a "a" :b "b"})
#'user/m2
user> m2
{:a "a", :b "b"}
user> (= m1 m2)
true
user> (type m1)
clojure.lang.PersistentArrayMap
user> (type m2)
clojure.lang.PersistentHashMap
Run Code Online (Sandbox Code Playgroud)
在第二个例子中,我们有一个hashmap和一个记录,它们在结构上是等价的,但是= function返回false:
user> (defrecord Titi [a b])
user.Titi
user> (def titi (Titi. 1 2))
#'user/titi
user> titi
#user.Titi{:a 1, :b 2}
user> (= titi {:a 1 :b 2})
false
Run Code Online (Sandbox Code Playgroud)
为什么会有差异?我正在使用Clojure 1.3,我发现它们真的令人困惑.
我正在尝试使用lein-cljsbuild编译一些JS库,以将它们集成到我们的ClojureScript代码库中.首先,我在每个文件的顶部添加了一些goog.provide,并且文件根据其命名空间(如Java中)在目录树中按层次结构组织.这就是命名空间abc在src-js/libs/a/b/c.js中
我把JS文件放在src-js/libs项目的根目录中,我有以下内容:lein-cljsbuild的编译器选项:
{:id "prod",
:source-paths ["src-cljs" "src-js"]
:compiler
{:pretty-print false,
:libs ["libs/"]
:output-to "resources/public/js/compiled-app.js",
:optimizations :simple}}
Run Code Online (Sandbox Code Playgroud)
没有JS文件被编译到编译应用程序文件中.怎么了?
我也尝试将它们放在resources/closure-js/libs中但没有成功.
我正在使用lein-cljsbuild 0.3.0.
我正在玩,Control.Applicative我意识到我不了解Haskell类型系统的一切.
这是我在Ghci的实验:
? :t (<*>)
(<*>) :: Applicative f => f (a -> b) -> f a -> f b
? :t (<*>) (pure 2)
(<*>) (pure 2) :: (Num (a -> b), Applicative f) => f a -> f b
Run Code Online (Sandbox Code Playgroud)
第一个参数的类型<*>是f (a -> b).
(pure 2)因为常量2不是类型a -> b?Num (a -> b)意思?具有a -> b类型的函数如何成为Num?的实例?我可以在 Erlang 中做到这一点:
io:fwrite("~.16X~n", [-31,"0x"]).
-0x1F
ok
Run Code Online (Sandbox Code Playgroud)
但不是在 Elixir 中:
:io.fwrite("~.16X~n", [-31,"0x"])
** (ArgumentError) argument error
(stdlib) :io.format(#PID<0.54.0>, "~.16X~n", [-31, "0x"])
为什么不?
BindPrelude中类的定义是:
class Apply m <= Bind m where
bind :: forall a b. m a -> (a -> m b) -> m b
Run Code Online (Sandbox Code Playgroud)
它可以作为一个函数读取,它接受两个输入参数,monadic context(m a)和function(a -> m b)中的值,并在monadic context(m b)中返回一个值.
Bind部分应用函数的实例定义为:
instance bindFn :: Bind ((->) r) where
bind m f x = f (m x) x
Run Code Online (Sandbox Code Playgroud)
这是一个采用三个参数的函数.那个类型检查怎么样?
如果我尝试用m a更具体的类型替换我得到(如果我错了,请纠正我):
(((->) ??) a) -> (a -> (((->) ??) b)) -> (((->) ??) b)
Run Code Online (Sandbox Code Playgroud)
这相当于
(?? …Run Code Online (Sandbox Code Playgroud) 在purescript-free程序包中,有一个定义此解释器的代码示例:
teletypeN :: forall eff. NaturalTransformation TeletypeF (Eff (console :: CONSOLE | eff))
teletypeN (PutStrLn s a) = const a <$> log s
teletypeN (GetLine k) = pure (k "fake input")
Run Code Online (Sandbox Code Playgroud)
如何定义和运行返回类型为Array Int或的其他解释器State String Int?
无论如何,是否可以更优雅地编写以下函数?
我可以看到一些模式,但不确定如何抽象它们或如何找到一种更简单的编写函数的方法。
type HasRemainder = Boolean
tomorrow :: Date -> Date
tomorrow date = unsafePartial $ canonicalDate y (fst m) (fst d)
where d :: Tuple Day HasRemainder
d = case toEnum $ 1 + fromEnum (day date) of
Just v -> Tuple v false
Nothing -> Tuple (unsafePartial $ fromJust $ toEnum 1) true
m :: Tuple Month HasRemainder
m = if snd d then
case toEnum $ 1 + fromEnum (month date) of
Just v -> Tuple v …Run Code Online (Sandbox Code Playgroud) purescript ×3
clojure ×2
applicative ×1
cljsbuild ×1
compojure ×1
date ×1
elixir ×1
emacs ×1
ensime ×1
equality ×1
free-monad ×1
haskell ×1
leiningen ×1
map ×1
monads ×1
record ×1
sbt ×1
type-systems ×1