小编Nic*_* M.的帖子

为什么Haskell的"翻转id"有这种类型?

我对表达很好奇flip id(这不是作业:我在getOpt文档中找到了它).

我想知道它为什么有这种类型:

Prelude> :t (flip id)
(flip id) :: b -> (b -> c) -> c
Run Code Online (Sandbox Code Playgroud)

例如,(flip id) 5 (+6)给出11.

我知道为什么id (+6) 5给11,但我不"得到"的flip id东西.

我试图用笔和纸来解决这个问题但不能.有人可以向我解释一下吗?我的意思是,怎么样flip id的类型b -> (b -> c) -> c

haskell

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

Lua是否优化了".."运算符?

我必须执行以下代码:

local filename = dir .. "/" .. base
Run Code Online (Sandbox Code Playgroud)

循环中数千次(这是一个打印目录树的递归).

现在,我想知道Lua是否一次性连接3个字符串(dir,"/",base)(即通过分配足够长的字符串来保存它们的总长度),或者它是否通过在内部执行它来实现这种效率低下的方式两个步骤:

local filename = (dir .. "/")              -- step1
                               .. base     -- step2
Run Code Online (Sandbox Code Playgroud)

最后一种方式是内存方式效率低下,因为分配了两个字符串而不是一个字符串.

我不太关心CPU周期:我主要关心内存消耗.

最后,让我概括一下这个问题:

Lua在执行以下代码时是否只分配一个字符串或4?

local result = str1 .. str2 .. str3 .. str4 .. str5
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我知道我能做到:

local filename = string.format("%s/%s", dir, base)
Run Code Online (Sandbox Code Playgroud)

但我还没有对它进行基准测试(内存和CPU方面).

(顺便说一句,我知道table:concat().这会增加创建表的开销,所以我猜它在所有用例中都不会有用.)

奖金问题:

如果Lua没有优化".."运算符,那么定义用于连接字符串的C函数是否是一个好主意,例如utils.concat(dir, "/", base, ".", extension)

c string performance lua

18
推荐指数
2
解决办法
5020
查看次数

为什么`put(nil或4)`在Ruby中失败?

当我做:

puts(nil or 4)
Run Code Online (Sandbox Code Playgroud)

Ruby抱怨:

SyntaxError: syntax error, unexpected keyword_or, expecting ')'
Run Code Online (Sandbox Code Playgroud)

这是为什么?puts(nil || 4)确实有效,但我想知道为什么or不这样做.我认为两者之间的区别只在于它们的运算符优先级.

(我知道这个表达nil or 4似乎没有用,因为它总是会返回4.这只是一个例子,为了简单起见.我的实际表达是Integer(ENV['WD'] or 4).)

ruby

18
推荐指数
3
解决办法
733
查看次数

为什么我们需要两次调用Lua的collectgarbage()?

我曾经遇到过几个 地方,人们称之为collectgarbage() 两次来完成所有未使用的对象.

这是为什么?为什么单个电话不够?为什么不打三个电话?

当我尝试下面的代码(在Lua 5.2上)时,__gc只需一次调用就可以最终确定对象(意思是:它被调用)collectgarbage:

do
  local x = setmetatable({},{
    __gc = function() print("works") end
  })
end
collectgarbage()
os.exit()
Run Code Online (Sandbox Code Playgroud)

这是否意味着一个电话就足够了?

lua garbage-collection

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

为什么这个正则表达式在sed中的运行方式与Perl/Ruby不同?

我有一个正则表达式给我一个结果,sed但在Perl(和Ruby)中有另一个结果.

我有字符串one;two;;three,我想突出显示由;.分隔的子字符串.所以我在Perl中执行以下操作:

$a = "one;two;;three";
$a =~ s/([^;]*)/[\1]/g;
print $a;
Run Code Online (Sandbox Code Playgroud)

(或者,在Ruby中:print "one;two;;three".gsub(/([^;]*)/, "[\\1]").)

结果是:

[one][];[two][];[];[three][]
Run Code Online (Sandbox Code Playgroud)

(我知道虚假空子串的原因.)

奇怪的是,当我运行相同的正则表达式时,sed我得到了不同的结果.我跑:

echo "one;two;;three" | sed -e 's/[^;]*/[\0]/g'
Run Code Online (Sandbox Code Playgroud)

我得到:

[one];[two];[];[three]
Run Code Online (Sandbox Code Playgroud)

造成这种不同结果的原因是什么?

编辑:

有人回答"因为sed不是perl".我知道.我问我的问题的原因是因为我不明白如何sed应对零长度匹配.

ruby regex perl sed

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

从C中的Lua函数返回'nil'与返回0值

一些Lua函数返回nil以通知用户该函数不能执行某些任务(例如tonumber(),string.find()).

在C中,returnig nil就是这样完成的:

int some_function(lua_State* L) {
  ...
  if (some condition) {
      lua_pushnil(L);
      return 1;
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

但是,我想知道是否可以做以下事情:

int some_function(lua_State* L) {
  ...
  if (some condition) {
      return 0;
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

它更短.我尝试了它似乎有效,但我不知道这是否是按设计的.我检查了Lua的源代码,我没有看到这种return 0模式,所以我想知道这样做是否合法.

两种不同的返回方式是否nil相同?

(顺便说一句,我知道所有关于通过异常发出的信号错误(也就是说),lua_error()所以请不要提及它.)

更新:

我现在看到两种方法之间存在细微的差别:print((function() end)())没有打印,而是print((function() return nil end)())打印"nil".我不知道这有多重要.

c lua

9
推荐指数
2
解决办法
4744
查看次数

LuaJIT是否支持表__gc?

Lua 5.2(与5.1相反)支持表的__gc.

LuaJIT借用了这个不错的功能吗?

(我做了谷歌搜索,并检查了LuaJIT的变更历史,但无法找到答案.)

lua luajit

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

在Lua中使用string.gmatch()拆分字符串

这里有一些讨论和实用函数,用于分割字符串,但是我需要一个特殊的单行程来完成一个非常简单的任务.

我有以下字符串:

local s = "one;two;;four"
Run Code Online (Sandbox Code Playgroud)

我想分开它";".我想最终得到{ "one", "two", "", "four" }回报.

所以我试着这样做:

local s = "one;two;;four"

local words = {}
for w in s:gmatch("([^;]*)") do table.insert(words, w) end
Run Code Online (Sandbox Code Playgroud)

但结果(words表)是{ "one", "", "two", "", "", "four", "" }.那肯定不是我想要的.

现在,正如我所说,这里有一些关于分裂字符串的讨论,但它们中有"冗长"的功能,我需要一些简洁的东西.我需要这个代码用于一个程序,在那里我展示了Lua的优点,如果我添加一个冗长的函数来做一些如此微不足道的事情,它将违背我.

string lua lua-patterns

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

Haskell列表理解中的非详尽模式

可能重复:
当模式匹配失败时,为什么Haskell列表推导不会导致错误?

今天我看到了以下代码:

Prelude> [a | Just a <- [Just 10, Nothing, Just 20]]
[10, 20]
Run Code Online (Sandbox Code Playgroud)

有用.但我认为上面的列表理解只是...的语法糖

[Just 10, Nothing, Just 20] >>= (\(Just x) -> return x)
Run Code Online (Sandbox Code Playgroud)

... Haskell在遇到时Nothing会发出错误*** Exception: Non-exhaustive patterns in lambda.

所以我的问题是:什么[a | Just a <- [Just 10, Nothing, Just 20]]转化为(在monadic代码方面)使它忽略了Nothing

haskell list-comprehension

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

Vala 数组支持哪些方法和属性?

瓦拉教程提到以下方法和属性(和运营商)内置阵列:

arr.length
arr += element
arr.resize()
arr.move()
Run Code Online (Sandbox Code Playgroud)

(我所说的“内置数组”是指类似于int[] arr = new int[5]GLib 或 Gee 提供的花哨数据结构。)

我的问题:这样的数组是否支持更多的方法和属性?这是在哪里记录的?

vala

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