如果有人能帮助我理解在枚举器中使用Yielder与在枚举器中调用yield之间的区别,我将不胜感激.
"有根据的Rubyist"表明,人们不会"从块中屈服",但并不能准确地解释发生了什么.
谢谢
这是在函数Haskell中定义变量时询问的问题的重构
我有一个函数,其开头看起来像这样:
recursiveLs :: FilePath -> IO [FilePath]
recursiveLs dir =
do
folderExists <- doesDirectoryExist dir
if folderExists
then ...
Run Code Online (Sandbox Code Playgroud)
问题是,如何folderExists在动作中分配给它之前明确声明类型?
我假设copy属性的目的是让我可以将一个属性分配给另一个(比方说)并让底层的getter/setter方法正确处理所有事情.但是我已经回顾了很多文章(包括一些关于stackoverflow的文章),我不清楚仅仅使用适当的方法来明确地复制内容有什么好处.首先,我发现将可变字符串分配给另一个可变字符串仍然会留下一个不可变的字符串,那么有什么用呢?
这适用于其他类吗?换句话说,一般来说,如果我有
@property (copy) Foo* f1;
@property (copy) Foo* f2;
....
@property (copy) Foo* fn;
Run Code Online (Sandbox Code Playgroud)
我一般可以写
f1 = f2
f3 = f2
Run Code Online (Sandbox Code Playgroud)
并获得适当的副本,即完全独立的对象?
考虑以下代码(省略明显的部分)
main = do
let s = "123456";
let len = runReader calculateContentLength s
putStrLn $ "Original 's' length: " ++ (show len)
calculateContentLength :: Reader String Int
calculateContentLength = do
content <- ask -- this seems to be the same as 'reader id'
return (length content);
Run Code Online (Sandbox Code Playgroud)
'ask'如何获取字符串参数?这是我的理解,因为类型声明
calculateContentLength :: Reader String Int
Run Code Online (Sandbox Code Playgroud)
函数'calculateContentLength'有一个返回类型(类型为Reader String Int),但它没有传入的参数.我意识到函数本身只是传递给runReader函数的两个参数之一,但是runReader的第二个参数's'与'calculateContentLength'中的'ask'有什么关联?
换句话说,'calculateContentLength'如何"知道"关于(并获取访问)传递给'runReader'的第二个参数?
考虑下面的简单数据结构(我正在学习如何使用attoparsec).我没有自动导出节目,而是为它创建了一个实例.但是,如果DateDefinition中项目的顺序发生了变化,那么该实例将立即中断(返回错误答案)(例如,我将dayOfMonth放在monthOfYear之前).必须有一种方法可以将模式中的每个条目与数据结构中的每个条目相关联,这样它就不会受到项目顺序的变化的影响.但是怎么样?我尝试使用实际的名称,但不出所料,这不起作用,只是导致关于阴影现有绑定的警告.
data DateDefinition = DateDefinition
{
monthOfYear :: Months,
dayOfMonth :: Int,
hourOfDay :: Int,
minuteOfHour :: Int,
secondOfMinute :: Int
}
instance Show DateDefinition where
show (DateDefinition m d _ _ _) = show m ++ " " ++ show d
Run Code Online (Sandbox Code Playgroud) 假设我有以下内容:
variableDeclaration: Identifier COLON Type SEMICOLON;
Type: T_INTEGER | T_CHAR | T_STRING | T_DOUBLE | T_BOOLEAN;
Run Code Online (Sandbox Code Playgroud)
那些T_名称只被定义为"整数","char"等.
现在假设我在一个名为LittleLanguage的测试程序的exitVariableDeclaration方法中.我可以参考LittleLanguageLexer.T_INTEGER(等),但我看不出如何确定通过上下文找到了哪些类型.
我以为它会是context.Type().getSymbol().getType()但是它没有返回正确的值.我知道我可以使用context.Type().getText()但我真的不想做字符串比较.
我错过了什么?
谢谢
我正在使用C++版本的ANTLR4为音乐产品开发DSL.我曾经(30年前!)手工做这种事情所以很高兴有一些像ANTLR这样的东西,特别是现在我不必在实际的语法定义中插入代码.
我想在函数调用中对实际与正式args进行类型检查.在下面的语法段中,'actualParameter'可以返回表达式的类型.但是,'actualParameterList'需要返回这些类型的数组(例如),以便functionCall的代码可以与形式参数列表进行比较.
如果我手写这个,那么访问或visitChildren的调用将在上下文之后获取额外的参数,这样我可以在适当的位置创建一个新数组,然后让子节点填充详细信息.
我想,不是只是在'visitActualParameterList'中调用visitChildren,我可以在那里创建数组并手动调用每个子进程,而不仅仅是一个简单的visitChildren,但这感觉就像一个hack,并且它对语法中的微小变化变得非常敏感.
有更好的方法吗?
functionCall: Identifier LeftParen actualParameterList? RightParen
;
actualParameterList:
actualParameter anotherActualParameter
;
actualParameter:
expression
;
anotherActualParameter:
Comma actualParameter anotherActualParameter
|
;
Run Code Online (Sandbox Code Playgroud) 在下面的示例中,我希望能够直接调用'ls'函数(请参阅示例的最后一个注释掉的行),但我无法找出正确的语法.提前致谢.
module Main (main) where
import System.Directory
ls :: FilePath -> IO [FilePath]
ls dir = do
fileList <- getDirectoryContents dir
return fileList
main = do
fileList <- ls "."
mapM putStrLn fileList
-- How can I just use the ls call directly like in the following (which doesn't compile)?
-- mapM putStrLn (ls".")
Run Code Online (Sandbox Code Playgroud) 我一直在努力解决这个问题.考虑以下代码(我假设已经定义了前向引用):
// Signature representing a pointer to a method call
typedef
void (MyClass::*MyMethod)(int);
class MyClass
{
MyClass();
void method1(int i);
void method2(int i);
void associateMethod(int index, MyMethod m);
}
Run Code Online (Sandbox Code Playgroud)
鉴于上述情况,构造函数可以执行以下操作:
MyClass::MyClass()
{
associateMethod(1, &MyClass::method1);
associateMethod(2, &MyClass::method2);
}
Run Code Online (Sandbox Code Playgroud)
但是,我希望能够调用'associateMethod',其中第二个参数是匿名方法.但是,以下内容无法编译.
associateMethod(3, [this](int) -> void { /* some code here */ }
Run Code Online (Sandbox Code Playgroud)
我得到一个关于他们没有从lambda到MyMethod的可行转换的错误.
我想知道lambda语法是否需要在某处包含'MyClass',但随机猜测lambda表达式如
MyClass::[this](int) -> void {}
Run Code Online (Sandbox Code Playgroud)
要么
[this]&MyClass::(int) -> void {}
Run Code Online (Sandbox Code Playgroud)
不编译.
会欣赏任何指针(没有双关语意)
谢谢
我们正在努力学习Haskell(大约第5次!)并且仍然在努力解决一些基本问题.
那么我怎么能写
main = print (map (* 2) [1..5])
Run Code Online (Sandbox Code Playgroud)
但我不能写
myfunc x =
map ( (+ x) [1..5])
main = print (myfunc 2)
Run Code Online (Sandbox Code Playgroud)
任何指导都会受到赞赏---我们有通常的书,但他们并没有真正帮助.
haskell ×5
antlr4 ×2
monads ×2
c++ ×1
enumerable ×1
java ×1
lambda ×1
methods ×1
objective-c ×1
reader-monad ×1
ruby ×1
syntax ×1