小编Joh*_*ler的帖子

使用什么机制来允许从该范围调用ruby根范围中定义的方法?

在ruby中,当在根范围中定义方法时,可以从该范围调用它:

def foo
  "foo"
end
foo #=> "foo"
Run Code Online (Sandbox Code Playgroud)

在任何其他情况下,情况并非如此:

class Bar
  def foo
    "foo"
  end
  foo #=> Error: No Method `foo` for class Bar
end
Run Code Online (Sandbox Code Playgroud)

在设置允许这种情况发生的main对象(实例Object)时使用了什么机制?

ruby class-design language-design metaprogramming

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

如何让grep保持文件/管道打开?

我正在尝试调试实时Merb应用程序中的一些错误.运行时有很多错误代码,但我需要看到第一个.我可以grep用来选择这些行并打印它们,但它一到达文件末尾就会关闭.

我想要做的是使用grep,就像它保持文件打开的shift-F模式一样,less并在写入日志时报告新的匹配行.

- or -

有没有办法直接用less我不知道的方式做到这一点?

shell command-line grep

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

实践中出现ErrorT catchError

我有一个非常典型的设置,在IO monad中有一组可以抛出错误的函数.到目前为止,我刚刚通过模式匹配runErrorT的结果来处理monad链末尾的错误:

replLisp :: LispScope -> String -> IO String
replLisp s input = do
  result <- runErrorT (evalLisp s input)
  return $ either (id) (show) result 
Run Code Online (Sandbox Code Playgroud)

我现在想为我的Hacked小方案添加一些错误处理,但是我很难让类型检查器开心.

如何使用catchError?一两个例子会有所帮助.


这是我最近的尝试:

catch :: [LispVal] -> IOThrowsError LispVal
catch [action rescue] = do
  eval action >>= catchError $ eval rescue
Run Code Online (Sandbox Code Playgroud)

error-handling haskell

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

Jekyll每次都会重新编译每一页

当我运行jekyll生成我的网站时,它会重新生成每个页面.如何告诉它只生成新的或已更改的页面?

另外,我在做什么让Jekyll认为需要重新创建每一页?

jekyll

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

如何消除未完全实现的类的警告

我将我的数据类型声明为类的实例,Num并仅实现方法和(+).其他的方法,如(*),negate,abs,fromInteger等我不落实.原因是我的数据类型不需要这些方法.

我编译程序,除了一些不舒服的警告之外没关系,例如:

Warning: No explicit method nor default method for `*'
...
Run Code Online (Sandbox Code Playgroud)

如何避免这些警告,或者我是否需要实施上述方法?实际上,我不想实现它们.

haskell compiler-warnings

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

如何编写Control.Lens.AT的实例

我有一个数据结构,可以理解为类似于将Data.Map一种类型的键映射到另一种类型的值.我想写一个Control.Lens.At这种类型的实例,但我似乎无法满足所有要求.

由于Struct k vlookup,insert,update,和delete,我必须做什么做instance At (Struct k v)的工作?

haskell lenses haskell-lens

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

如何在数据类型中存储多态函数

我有一个data类型,我想存储一个函数:State Foo a -> a.据推测,当创建此类型的实例时,程序将部分应用于evalState计算的初始状态并将结果函数存储在数据结构中.稍后,可以从实例检索该函数,并用于评估Statemonad中的一个或多个计算并获得结果.

-- This doesn't work
data Bar = Bar {
  -- other members here
  runWithState :: State Foo a -> a
}

==> Not in scope: type variable 'a'
Run Code Online (Sandbox Code Playgroud)

我不能更具体,因为我不知道计算的最终结果是什么,它可能会根据计算产生的结果而改变.

如何使类型检查器与此一起工作?

polymorphism haskell algebraic-data-types

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

免费Monad的MonadError实例

我用sum数据类型创建了一个非常有用的Free Monad.这抽象了对持久性数据存储的访问:

data DataStoreF next = 
     Create    Asset                           ( String -> next)
  |  Read      String                          ( Asset  -> next)
  |  Update    Asset                           ( Bool   -> next)
  |  UpdateAll [Asset]                         ( Bool   -> next)
  |  Delete    Asset                           ( Bool   -> next)
  |  [...] -- etc. etc.
  |  Error     String

type DataStore = Free DataStoreF
Run Code Online (Sandbox Code Playgroud)

我想将错误消息DataStore的实例MonadError处理为(Free (Error str)):

instance MonadError String DataStore where
  throwError str = errorDS str
  catchError (Free (ErrorDS str)) f = f str …
Run Code Online (Sandbox Code Playgroud)

haskell typeclass overlapping-instances free-monad

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

在C中,函数可以返回指向自身的指针吗?

背景

因此,当您花费几年时间编写 Haskell 然后返回裸机 C 代码时,会发生以下情况:

问题

函数是否可以将与函数本身类型相同的指针作为其返回类型?是这样,语法是什么?

函数名称是否在函数体范围内?或者我可以获得当前正在执行的函数的地址?

例如

void foo() {
  callmeback(&foo); // is this legal
}
Run Code Online (Sandbox Code Playgroud)

你为什么想做这个?

我有一个状态机,可以处理一些非常有限的控件的用户输入,这意味着两个输入操作必须服务于几种不同的模式。我正在将充满 switch 语句和全局变量的意大利面条代码重构为更易于维护的代码。如果我在 Haskell 中工作,我会使用用户输入调用当前模式函数,并让它返回一个函数以使用后续输入调用——无论是它本身还是新模式的处理程序。我开始用 C 语言执行此操作,并意识到我不知道如何编写处理函数的类型。如果这不起作用,我将简单地为下一个处理程序设置一个全局变量,然后继续生活,但我只需要问是否可以像在函数式语言中一样完成它。

对于那些好奇的人来说,这一切都在 ESP32 上运行,这是一种功能更强大的处理器,但类似于 Arduino 附带的处理器。

c function-pointers

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

为什么函数的类型在GHCi中出现monad时会发生变化

当一个函数出现在monad中时,它会发生一些变化.

在GHCI中:

> :t map
map :: (a -> b) -> [a] -> [b]
> a <- return map
> :t a
a :: (GHC.Prim.Any -> GHC.Prim.Any)
 -> [GHC.Prim.Any] -> [GHC.Prim.Any]
Run Code Online (Sandbox Code Playgroud)

此更改使得难以将函数存储在更高级别的类型中.

这里发生了什么,我可以让它不会发生吗?

(这也不违反monad法律之一吗?)

polymorphism haskell ghc ghci

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