小编Mar*_*ark的帖子

Common Lisp函数没有返回任何值

我已经读过,Common Lisp中的每个表单在评估时都会返回一些内容.但是,最近我一直在玩ASDF API并找到一个什么都不返回的函数:

CL-USER> (asdf:clear-output-translations)
; No value
Run Code Online (Sandbox Code Playgroud)

这怎么可能,为什么不回归NIL呢?

lisp function common-lisp return-value

5
推荐指数
2
解决办法
797
查看次数

"Hello,World!"出乎意料的困难

我想学习Clojure,我已经下载并设置了以下小玩意:

  • 来自官方网站的Clojure 1.6.0;
  • 莱宁根2.4.3;
  • 来自GitHub的苹果酒0.6.0.

我有它的工作.现在我正在尝试打印消息"Hello, World!",同时在Emacs中运行Cider:

; CIDER 0.6.0 (Java 1.7.0_65, Clojure 1.6.0, nREPL 0.2.0-beta5)
user> (println "Hello World!")
Hello World!NoSuchMethodError clojure.tools.nrepl.StdOutBuffer.length()I
clojure.tools.nrepl.middleware.session/session-out/fn--7630
(session.clj:43)NoSuchMethodError clojure.tools.nrepl.StdOutBuffer.length()I
clojure.tools.nrepl.middleware.session/session-out/fn--7630 (session.clj:43)
user> 
Run Code Online (Sandbox Code Playgroud)

这噪音到底是什么?我跑的时候:

$ clojure
;Clojure 1.6.0
user=> (println "Hello, World!")
Hello, World!
nil
Run Code Online (Sandbox Code Playgroud)

一切都好.当我和Leiningen一起做的时候:

$ lein repl
; lotsa stuff here...
user=> (println "Hello, World!")
Run Code Online (Sandbox Code Playgroud)

输入这个命令后,我津津乐道以下诗歌:

CompilerException java.lang.RuntimeException: Unable to resolve symbol: rprintln in this context, compiling:(NO_SOURCE_PATH:1:1) NoSuchMethodError clojure.tools.nrepl.StdOutBuffer.length()I  clojure.tools.nrepl.middleware.session/session-out/fn--7630 (session.clj:43)
Exception in thread "nREPL-worker-3" java.lang.NoSuchMethodError: clojure.tools.nrepl.StdOutBuffer.length()I
    at clojure.tools.nrepl.middleware.session$session_out$fn__7630.doInvoke(session.clj:43)
    at …
Run Code Online (Sandbox Code Playgroud)

emacs compiler-errors clojure leiningen

5
推荐指数
1
解决办法
574
查看次数

GHCi无法找到我的程序模块

我正在开展一个项目,我正在使用Cabal进行管理.我已经指定了源文件,模块,所有东西的目录.我的所有文件都与相应的模块具有相同的名称,保留了大小写.

我可以:

$ cabal configure
$ cabal build
Run Code Online (Sandbox Code Playgroud)

没有问题.

但是,想象一下我Module在文件中有一个模块Module.hs,并且文件File.hs在同一目录中.现在,当我尝试File.hs从Emacs 加载进行测试时,我得到以下内容:

____Could not find module ‘Module’
    It is a member of the hidden package ‘ghc-7.8.3’.
    Use -v to see a list of the files searched for.
Failed, modules loaded: none.
Run Code Online (Sandbox Code Playgroud)

全部内容File.hs:

module File where
import Module
Run Code Online (Sandbox Code Playgroud)

如何让它找到我的项目的文件?

emacs haskell cabal

5
推荐指数
2
解决办法
8676
查看次数

定义类型类时类型变量不在范围内

我正在编写一个类型类 à la mtl 风格的转换器。看起来像这样:

class (Monad m, Stream s m t) => MonadStuff s m | m -> s where
  -- function signatures go here…
Run Code Online (Sandbox Code Playgroud)

我试图通过该说m应该是实例Monad并且应该有实例Stream s m t,这里t没有真正的问题,但 sm是自定义的右侧(后=>)。

哈斯克尔说:

不在范围内:类型变量“t”

所以,显然我不能那样做。或者我可以吗?我应该删除Stream s m t 约束并将其添加到类中的每个函数中还是有其他方法?

haskell typeclass

5
推荐指数
1
解决办法
1246
查看次数

使用 QuickCheck 抛出异常时是否可以检查案例?

假设我有一个函数,它应该在一种情况下计算某个值,否则抛出异常。我想使用 QuickCheck 来确保我的函数正确运行,但是如何执行此类检查并不明显。是否有可能,如果是,如何检查抛出的某种类型的异常是否包含有关其原因的正确信息?

haskell exception quickcheck

5
推荐指数
1
解决办法
242
查看次数

使用 DataKinds 扩展时如何导出类型构造函数?

玩高级类型系统的东西。我想命名 kind 和几个产生这种类型的类型构造函数:

{-# LANGUAGE DataKinds #-}

data Subject = New | Existing
Run Code Online (Sandbox Code Playgroud)

在这里,据我所知,我们命名了 kindSubject和 type 构造函数 NewExisting它们是:: Subject. 这些类型构造函数不带参数(我打算将它们用作幻影类型),它应该大致相当于:

{-# LANGUAGE EmptyDataDecls #-}

data New
data Existing
Run Code Online (Sandbox Code Playgroud)

不同的是,现在我可以写:

{-# LANGUAGE DataKinds      #-}
{-# LANGUAGE GADTs          #-}
{-# LANGUAGE KindSignatures #-}

-- …

data MyConfig :: Subject -> * -> * where
  MyConfig
    { mcOneThing :: Path t File
    } :: MyConfig k t
Run Code Online (Sandbox Code Playgroud)

这甚至可以编译。令人困惑的是,数据类型的声明与数据类型声明无法区分,所以这段代码似乎产生了数据类型Subject以及命名类型Subject(?)对我来说更清楚的是,我们可以指定我们在哪个级别声明事物(种类,然后NewExisting是类型构造函数;或类型,然后 …

haskell types data-kinds

5
推荐指数
1
解决办法
361
查看次数

如何使用Haskell创建符号链接?

如何使用Haskell创建符号链接?据directory我所知,这个包没有提供一种方法.

symlink haskell

5
推荐指数
1
解决办法
420
查看次数

是否有可能重新实现使用GHC泛型得出的"Enum"

是否有可能Enum使用GHC泛型重新实现类型类的派生?

起初,它看起来很简单:

data Foo -- representation without metadata (wrong):
  = Foo  -- L1 U1
  | Bar  -- R1 (L1 U1)
  | Baz  -- R1 (R1 (L1 U1))
  | Quux -- R1 (R1 (R1 U1))
  deriving (Show, Eq, Generic)

-- Rep Foo p = (U1 :+: (U1 :+: (U1 :+: U1))) p

instance Enum Foo where
  toEnum   = undefined -- FIXME
  fromEnum = gfromEnum . from

class GEnum f where
  gfromEnum :: f p -> Int

instance GEnum U1 …
Run Code Online (Sandbox Code Playgroud)

generics enums haskell

5
推荐指数
1
解决办法
151
查看次数

在Haskell中生成随机数

我正在阅读第9章(更多输入和更多输出),了解大好的Haskell.现在我要学习如何在Haskell中生成随机数(这太激动了!).这是本书的引文:

要手动创建随机生成器,请使用mkStdGenfunction.它有一种类型mkStdGen :: Int -> StdGen.它需要一个整数,并在此基础上给我们一个随机生成器.那么,让我们尝试使用randommkStdGenin串联得到(几乎)随机数.

ghci> random (mkStdGen 100)
<interactive>:1:0:
Ambiguous type variable `a' in the constraint:
`Random a' arising from a use of `random' at <interactive>:1:0-20
Probable fix: add a type signature that fixes these type variable(s)
Run Code Online (Sandbox Code Playgroud)

这是什么?啊,对,该random函数可以返回Random类型类的任何类型的值,因此我们需要通知Haskell我们想要哪种类型.另外,我们不要忘记它会在一对中返回一个随机值和一个随机生成器.

问题是我没有得到这个错误,事实上,我可以做到以下几点:

*Main> :m + System.Random
*Main System.Random> random (mkStdGen 100)
(-3633736515773289454,693699796 2103410263)
Run Code Online (Sandbox Code Playgroud)

所以我的问题是为什么我可以在不获得异常的情况下评估此表达式?

random haskell

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

如何避免哈姆雷特模板中标签(链接)后的空格?

我找不到一种方法来呈现链接,然后在它之后使用逗号或句号,链接和标点符号之间没有空格。这是我的初步尝试:

<p>
  You can find more information #
  <a href="@{SomeRouteR}">here
  \.
Run Code Online (Sandbox Code Playgroud)

或者

<p>
  You can find more information #
  <a href="@{SomeRouteR}">here
  .
Run Code Online (Sandbox Code Playgroud)

这会在单词“here”和“.”之间插入空格。

另一种选择是:

<p>
  You can find more information #
  <a href="@{SomeRouteR}">here</a>.
Run Code Online (Sandbox Code Playgroud)

这看起来像一个胜利,但 HTML 格式错误:

<p>You can find more information <a href="…">here</a>.</a></p>
Run Code Online (Sandbox Code Playgroud)

有没有办法避免链接和标点符号/其他元素之间的空格?

haskell yesod hamlet

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