在ruby 1.9.3中,我正在尝试编写一个程序,它将从任意一组字符中找到包含n个字符的所有单词.所以,例如,如果我给出了字符[b,a,h,s,v,i,e,y,k,s,a]和n = 5,我需要找到所有可以使用的5个字母的单词只使用那些字符.使用http://wordlist.sourceforge.net/中的2of4brif.txt单词列表(也包括英国单词和拼写),我尝试了以下代码:
a = %w[b a h s v i e y k s a]
a.permutation(5).map(&:join).each do |x|
File.open('2of4brif.txt').each_line do |line|
puts line if line.match(/^[#{x}]+$/)
end
end
Run Code Online (Sandbox Code Playgroud)
这没有任何作用(没有错误消息,没有输出,就像冻结一样).我还尝试了基于以下线程的变体:
我尝试过的每一个变化都导致:
1)冷冻;
2)打印列表中包含5个字符排列的所有单词(我假设它正在做什么;我没有检查所有数千个打印的单词); 要么
3)打印列表中单词中发现的所有5个字符的排列(再次,我认为这是它正在做的事情).
同样,我不是在寻找包含 5个字符排列的单词,我正在寻找5个字符的排列,这些排列本身就是完整的单词,因此文本文件中的一行只有在打印时才能打印出来.完美匹配排列.
我究竟做错了什么?提前致谢!
我正在使用Google Maps API计算我的公司的车辆在一段时间内在每个州行驶的里程数。对于这段时间内的旅行,用户将在地图上创建路线,程序应能够生成一些输出,例如:“马里兰:100英里,弗吉尼亚:500英里”,等等。
我很确定我可以通过发送DirectionsService请求并遍历response.routes[i].legs[i].steps[i].path数组来做到这一点,但是不幸的是,这需要Geocoder在数千个LatLngs 上发送请求,这很快使我超出了配额。有没有更好的方法来解决这个问题?我真的只需要检测路线何时越过状态线并将其分成单独的路线,但是我不知道如果不遍历path数组怎么做。
我发现定义一个宏同时在clj和cljs中进行错误处理非常棘手。我以为这是交换的一个简单的事情Exception有js/Error,但它竟然比更复杂。
一开始,我尝试过这样:
(defmacro my-macro
[& forms]
`(try
~@forms
(catch #?(:clj Exception :cljs js/Error) e#
,,,)))
Run Code Online (Sandbox Code Playgroud)
但这Exception每次都会产生。我很快意识到问题是在我的cljs文件的编译过程中调用了宏,这种情况发生在clj环境中。因此,我将不得不让宏返回一种形式,该形式将在运行时解析为正确的异常类。我尝试了这个:
(def exception-class
#?(:clj Exception :cljs js/Error))
(defmacro my-macro
[& forms]
`(try
~@forms
(catch exception-class e#
,,,)))
Run Code Online (Sandbox Code Playgroud)
现在它可以在cljs中工作,但不能在clj中工作!经过一些试验,我发现JVM Clojure(显然)不允许您间接引用异常类。您必须Exception直接通过名称引用。
所以最后,我决定了:
(def fake-java
#?(:cljs (clj->js {:lang {:Exception js/Error}})))
(defmacro my-macro
[& forms]
`(let [~'java fake-java]
(try
~@forms
(catch Exception e#
,,,))))
Run Code Online (Sandbox Code Playgroud)
Exception扩展到java.lang.Exception,现在可以在运行时在clj …
我正在开展一个项目,以在 Clojure 中重新创建 Haskell 的一些功能。我已经成功地实现了 Hindley-Milner 类型推断,现在我正在尝试通过宏引入模式匹配语法。我的目标是让宏首先发出有效的 Clojure 代码,然后对该代码进行类型检查,但我发现这很难做到。由于我是 Haskell 和静态类型的新手,因此我不确定是否有我看不到的方法,或者是否不可能。
我正在尝试遵循Luc Maranget 的算法,至少目前是天真的版本。我的理解是,您在编译时采用值向量(或“出现次数”)并将其视为堆栈。通过第一列的构造函数对模式行进行分组后,您将找到与向量中第一个值的构造函数对应的模式组。如果向量是(v1 ... vn),v1是c(a1 ... ak),其中c是构造函数,a1 ... ak是构造函数的参数,则删除构造函数c并将参数与向量连接起来,创建新的向量(a1 ... ak v2 ... vn),然后递归地运行算法。
我的问题是,您如何以可类型检查的方式表示这样的向量或堆栈?同样,我的目标是让 Clojure 宏发出既准备好处理运行时值又准备在编译时进行类型检查的代码。我可以引入一个中间步骤,其中第一个宏发出可进行类型检查但本身也是一个宏的代码,然后让第二个宏发出实际运行的代码。但即使这样有效,也不太令人满意,因为它表明我无法在 Haskell 本身中完成这样的任务。我错过了什么吗?
- 编辑 -
我现在看到我的困惑源于我在静态类型方面的短暂经验中没有遇到过必须处理异构集合的情况。我的问题本来可以更清楚地表述出来,但由于我正在规划问题空间,因此我并不总是确定障碍是什么,或者它与我正在处理的其他所有事情有什么关系。感谢下面的评论,我相信为了克服这个特殊的挑战,我只需要更好地理解在 Haskell 中处理异构集合的可用选项。这篇文章似乎是一个很好的起点。
我试图通过在我经常使用的语言Clojure中实现算法W来自学Hindley-Milner类型推断.我遇到了let推理的问题,我不确定我做错了什么,或者我期望的结果是否需要算法以外的东西.
基本上,使用Haskell表示法,如果我尝试推断它的类型:
\a -> let b = a in b + 1
Run Code Online (Sandbox Code Playgroud)
我明白了:
Num a => t -> a
Run Code Online (Sandbox Code Playgroud)
但我应该得到这个:
Num a => a -> a
Run Code Online (Sandbox Code Playgroud)
同样,我实际上是在Clojure中这样做,但我不相信问题是Clojure特有的,所以我使用Haskell表示法使它更清晰.当我在Haskell中尝试它时,我得到了预期的结果.
无论如何,我可以通过将每个let转换为函数应用程序来解决该特定问题,例如:
\a -> (\b -> b + 1) a
Run Code Online (Sandbox Code Playgroud)
但后来我失去了let多态性.由于我对HM没有任何先验知识,我的问题是我是否在这里遗漏了一些东西,或者这只是算法的工作方式.
编辑
如果有人有类似的问题,并想知道我是如何解决它的,那我就是按照Algorith W Step by Step进行操作.在第2页的底部,它说"将Types方法扩展到列表有时会很有用".因为它对我来说听起来不是强制性的,所以我决定跳过那部分并稍后重新审视.
然后我将ftv函数TypeEnv直接翻译成Clojure,如下所示:(ftv (vals env)).由于我已经实现ftv了一个cond表单并且没有seqs 的子句,所以它只是返回nil了(vals env).这当然正是静态类型系统设计要捕获的那种错误!无论如何,我刚刚重新定义了ftv与env地图有关的条款,(reduce set/union …