如果我们想映射一个增加范围的每个元素的函数,我们可以写
map (\x -> x + 1) [1..5]
Run Code Online (Sandbox Code Playgroud)
但我猜大多数人都会选择
map (+1) [1..5]
Run Code Online (Sandbox Code Playgroud)
代替.但这显然不适用于(-1),因为那是负面的.
所以首先想到的是
map (+(-1)) [1..5]
Run Code Online (Sandbox Code Playgroud)
考虑到Prelude(x - y = x + negate y
)中如何定义减法,这是有意义的,但对我来说看起来有点奇怪.然后我想出了
map (flip (-) 1) [1..5]
Run Code Online (Sandbox Code Playgroud)
这对我来说看起来更好,但可能有点太复杂了.
现在我知道这没什么大不了的,但我想知道我是否错过了一个更明显的方法来写这个?如果没有,您更喜欢哪两种方式?我真的只是问,因为通常这样的小细节会让你的代码更加惯用,因此对于那些必须阅读它的开发人员来说也是如此.
解
现在我得到了几个答案,我认为我最喜欢的是
map (subtract 1) [1..5]
Run Code Online (Sandbox Code Playgroud)
其次是
map pred [1..5]
Run Code Online (Sandbox Code Playgroud)
主要是因为第一个是非常明确的,没有人需要猜测/查找是什么pred
意思(前任).
现在转移到Vim.在TextMate中,我可以通过点击格式化代码Cmd- - .Alt [我如何在Vim中实现同样的目标?
请参阅以下答案以获取该命令.我发现我还需要以下内容,.vimrc
以便Vim知道如何自动提交Ruby.
if has("autocmd")
filetype indent on
endif
Run Code Online (Sandbox Code Playgroud) 在玩Pointfree时,我遇到了一段我似乎无法理解的代码.
:pl map (\x -> x * x) [1..10]
-- map (join (*)) [1..10]
Run Code Online (Sandbox Code Playgroud)
我的主要问题是我不知道join
这里的工作方式.据我所知,它"移除"了一层monadic包装(m (m a)
to m a
).我觉得它归结为类似的东西[1..10] >>= (\x -> [x * x])
,但我真的不知道如何引入"额外的层".我明白了join x = x >>= id
,但是我仍然坚持如何"复制"每个值,以便(*)
得到两个参数.这已经困扰了我大约半个小时了,我对自己很生气,因为我觉得我有所有的拼图,但似乎无法将它们放在一起......
PS别担心,我不会真正使用这个免费版本,这是纯粹的好奇心,并试图更好地理解Haskell.
这个问题可能会以一个facepalm结束,但我已经尝试了一段时间,尽管阅读了hyperspec,我仍然陷入困境.
基本上我想做的就是这样
(format t "~{|~{ ~5d~}|~%~}" '((1 23 2 312) (23 456 1 7890)))
Run Code Online (Sandbox Code Playgroud)
但不是硬编码5,而是应该从列表中计算出来(任何嵌套列表中最长元素的长度+ 1)来给出像
| 1 23 2 312|
| 23 456 1 7890|
Run Code Online (Sandbox Code Playgroud)
也许我在这里想的太复杂了,有一种更简单的方法可以做我想要的事情,但我想我自己陷入了一个我无法摆脱的心理角落.
我有兴趣为我正在使用的第三方API编写库,我需要一些建议.在一次请求中,库的平均使用将涉及几个api调用.例如,一个api呼叫从第三方服务中抓取用户,然后另一个呼叫使用该用户抓取他/她的照片.每个API调用都将获得自己的库方法包装器以及处理错误/超时的额外逻辑,但我最大的问题是库是应该作为包含状态的单例还是作为一系列类方法.
例如:
user_id = ThirdParty.get_user("abc@gmail.com")
photos = ThirdParty.get_photos(user_id)
Run Code Online (Sandbox Code Playgroud)
要么
thirdpartyservice = ThirdPartyService.new("abc@gmail.com")
photos = thirdpartyservice.get_photos
Run Code Online (Sandbox Code Playgroud)
这些不一定是图书馆的确切设计,但我对每种方法的优缺点感到困惑.任何帮助都会很棒!
顺便说一句,我用的是红宝石!
我正在阅读jbuilder的README并看到这些代码:
class Person
# ... Class Definition ... #
def to_builder
Jbuilder.new do |person|
person.(self, :name, :age)
end
end
end
Run Code Online (Sandbox Code Playgroud)
我试图自己复制它,它要求一个call
方法,所以:
class Thing
attr_accessor :name, :age
def call(*args)
puts args.inspect
end
end
Thing.new.(:name, :age) # => [:name, :age]
Run Code Online (Sandbox Code Playgroud)
那么,为什么有一个self
在jbuilder
电话吗?
运行以下测试套件时:
require 'spec_helper'
describe User do
before { @user = User.(name: "Example User", email: "user@example.com" }
subject { @user }
it { should respond_to(:name) }
it { should respond_to(:email) }
end
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
Failure/Error: before { @user = User.(name: "Example User", email: "user@example.com") }
NoMethodError:
undefined method `call' for #<Class:0x007fdfd5dd8008>
# ./spec/models/user_spec.rb:15:in `block (2 levels) in <top (required)>'
Run Code Online (Sandbox Code Playgroud)
创建用户在控制台中工作正常,它响应方法.
在Ruby 1.8.7和rails 2.3.5上,我得到:
gem install rmagick
ERROR: Error installing rmagick:
ERROR: Failed to build gem native extension.
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby extconf.rb
mkmf.rb can't find header files for ruby at
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/ruby.h
Gem files will remain installed in /Library/Ruby/Gems/1.8/gems/rmagick-2.13.1 for inspection.
Results logged to /Library/Ruby/Gems/1.8/gems/rmagick-2.13.1/ext/RMagick/gem_make.out
Building native extensions. This could take a while...
Cynicalgrinch:levelous pawel$ gem install rmagick
Building native extensions. This could take a while...
ERROR: Error installing rmagick:
ERROR: Failed to build gem native extension.
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby extconf.rb
mkmf.rb can't find header files …
Run Code Online (Sandbox Code Playgroud) 我有一个继承自的类Hash
.当这个类本身被继承时,我想知道initialize
方法中继承类的类名.当我打电话给self
我时{}
,不知道该name
方法.
class Foo < Hash
def initialize
# Here i want to know that the class is Foo
end
end
Run Code Online (Sandbox Code Playgroud)
我如何获得课程名称?
考虑清单
[[],[1],[1,2],[1,2,3],[],[2],[2,3],[],[3],[]]
Run Code Online (Sandbox Code Playgroud)
我想过滤掉所有非空列表的元素,即过滤后的输出应该给我一个结果,如:
[[1],[1,2],[1,2,3],[2],[2,3],[3]]
Run Code Online (Sandbox Code Playgroud)
以下代码失败:
myfilter lst = filter(\x -> x/=[]) lst
Run Code Online (Sandbox Code Playgroud)
[12,3,[]]出现以下错误
No instance for (Num [a])
arising from the literal `3' at <interactive>:1:13
Possible fix: add an instance declaration for (Num [a])
In the expression: 3
In the first argument of `myfilter', namely `[12, 3, []]'
In the expression: myfilter [12, 3, []]
Run Code Online (Sandbox Code Playgroud) 我刚开始学习如何编写代码,我正在关注Chris Pine的Ruby教程.我完成了一项练习,让我打印出我的名字,然后是我的中间名,然后是我的姓,最后让我用我的全名来打招呼.我做的一切都正确,除了在最后我打印出我的全名这样:ParkerJacobsPreyer
我只是想知道如何确保这些变量的输出正确间隔?以下是相关的代码行:
puts 'Well it was great to meet you ' + name + middleName + lastName
Run Code Online (Sandbox Code Playgroud)