小编Mic*_*ohl的帖子

Currying减法

如果我们想映射一个增加范围的每个元素的函数,我们可以写

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意思(前任).

haskell coding-style

48
推荐指数
2
解决办法
3408
查看次数

在Vim中格式化Ruby代码

现在转移到Vim.在TextMate中,我可以通过点击格式化代码Cmd- - .Alt [我如何在Vim中实现同样的目标?


请参阅以下答案以获取该命令.我发现我还需要以下内容,.vimrc以便Vim知道如何自动提交Ruby.

if has("autocmd")
  filetype indent on
endif
Run Code Online (Sandbox Code Playgroud)

ruby vim code-formatting

27
推荐指数
2
解决办法
1万
查看次数

帮助理解pointfree代码

在玩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.

haskell pointfree

17
推荐指数
1
解决办法
802
查看次数

format - 帮助打印表格

这个问题可能会以一个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)

也许我在这里想的太复杂了,有一种更简单的方法可以做我想要的事情,但我想我自己陷入了一个我无法摆脱的心理角落.

lisp format

6
推荐指数
2
解决办法
1749
查看次数

在库中包装第三方服务的最佳实践

我有兴趣为我正在使用的第三方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)

这些不一定是图书馆的确切设计,但我对每种方法的优缺点感到困惑.任何帮助都会很棒!

顺便说一句,我用的是红宝石!

ruby api design-patterns ruby-on-rails

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

Ruby点括号调用语法

我正在阅读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)

那么,为什么有一个selfjbuilder电话吗?

ruby parameters syntax function

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

NoMethodError:未定义的方法`call'

运行以下测试套件时:

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 rspec ruby-on-rails

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

为什么我在安装rmagick时遇到问题

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

ruby ruby-on-rails rmagick

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

从Hash继承的类时,从initialize方法中获取类名

我有一个继承自的类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)

我如何获得课程名称?

ruby introspection

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

从列表中过滤出空列表

考虑清单

  [[],[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)

haskell haskell-platform

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

在Ruby中定义变量的输出之间放置空格

我刚开始学习如何编写代码,我正在关注Chris Pine的Ruby教程.我完成了一项练习,让我打印出我的名字,然后是我的中间名,然后是我的姓,最后让我用我的全名来打招呼.我做的一切都正确,除了在最后我打印出我的全名这样:ParkerJacobsPreyer我只是想知道如何确保这些变量的输出正确间隔?以下是相关的代码行:

puts 'Well it was great to meet you ' + name + middleName + lastName
Run Code Online (Sandbox Code Playgroud)

ruby

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