在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)时使用了什么机制?
我正在尝试调试实时Merb应用程序中的一些错误.运行时有很多错误代码,但我需要看到第一个.我可以grep用来选择这些行并打印它们,但它一到达文件末尾就会关闭.
我想要做的是使用grep,就像它保持文件打开的shift-F模式一样,less并在写入日志时报告新的匹配行.
- or -
有没有办法直接用less我不知道的方式做到这一点?
我有一个非常典型的设置,在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) 当我运行jekyll生成我的网站时,它会重新生成每个页面.如何告诉它只生成新的或已更改的页面?
另外,我在做什么让Jekyll认为需要重新创建每一页?
我将我的数据类型声明为类的实例,Num并仅实现方法和(+).其他的方法,如(*),negate,abs,fromInteger等我不落实.原因是我的数据类型不需要这些方法.
我编译程序,除了一些不舒服的警告之外没关系,例如:
Warning: No explicit method nor default method for `*'
...
Run Code Online (Sandbox Code Playgroud)
如何避免这些警告,或者我是否需要实施上述方法?实际上,我不想实现它们.
我有一个数据结构,可以理解为类似于将Data.Map一种类型的键映射到另一种类型的值.我想写一个Control.Lens.At这种类型的实例,但我似乎无法满足所有要求.
由于Struct k v有lookup,insert,update,和delete,我必须做什么做instance At (Struct k v)的工作?
我有一个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)
我不能更具体,因为我不知道计算的最终结果是什么,它可能会根据计算产生的结果而改变.
如何使类型检查器与此一起工作?
我用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 然后返回裸机 C 代码时,会发生以下情况:
问题
函数是否可以将与函数本身类型相同的指针作为其返回类型?是这样,语法是什么?
函数名称是否在函数体范围内?或者我可以获得当前正在执行的函数的地址?
例如
void foo() {
callmeback(&foo); // is this legal
}
Run Code Online (Sandbox Code Playgroud)
你为什么想做这个?
我有一个状态机,可以处理一些非常有限的控件的用户输入,这意味着两个输入操作必须服务于几种不同的模式。我正在将充满 switch 语句和全局变量的意大利面条代码重构为更易于维护的代码。如果我在 Haskell 中工作,我会使用用户输入调用当前模式函数,并让它返回一个函数以使用后续输入调用——无论是它本身还是新模式的处理程序。我开始用 C 语言执行此操作,并意识到我不知道如何编写处理函数的类型。如果这不起作用,我将简单地为下一个处理程序设置一个全局变量,然后继续生活,但我只需要问是否可以像在函数式语言中一样完成它。
对于那些好奇的人来说,这一切都在 ESP32 上运行,这是一种功能更强大的处理器,但类似于 Arduino 附带的处理器。
当一个函数出现在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法律之一吗?)
haskell ×6
polymorphism ×2
c ×1
class-design ×1
command-line ×1
free-monad ×1
ghc ×1
ghci ×1
grep ×1
haskell-lens ×1
jekyll ×1
lenses ×1
ruby ×1
shell ×1
typeclass ×1