我正在尝试在Haskell中创建一个Tree类型.我已经使用这个简单的数据构造函数来存储一个树,其中每个节点可以是空的,是包含整数的叶子,或者是包含一个整数的节点,该整数具有到另外两个叶子/节点的分支.这是我得到的:
module Tree ( Tree(Empty, Leaf, Node) ) where
data Tree = Empty
| Leaf Int
| Node Tree Int Tree
deriving(Eq, Ord, Show, Read)
Run Code Online (Sandbox Code Playgroud)
这工作正常,但我需要使树类型多态.我试过用'a'代替'Int',但它似乎不起作用.是否有另一个系统使这些类型多态?
基本上我需要做的是编写一个函数,它接受一个类型列表[(String, String)]并打印出内容,这样逐行输出如下所示:
FirstString : SecondString
FirstString : SecondString
Run Code Online (Sandbox Code Playgroud)
..etc,列表中的每个项目.我有以下代码,它打印出来,但由于某种原因,它打印出一行包含[(),()]在最后.
display :: Table -> IO ()
display zs = do {
xs <- sequence [putStrLn ( a ++ " = " ++ b) | (a, b) <- zs];
print xs
}
Run Code Online (Sandbox Code Playgroud)
有什么我做错了吗?
我正在开发一款游戏,我需要找到一种方法来获取游戏中某个"地图块"的值(以char格式).我有一个DisplayableObject类来处理所有精灵,还有一个子类ThreeDCubePlayer来处理玩家对象.为了便于呈现/更新所有内容,所有DisplayableObject都存储在一个数组中,第0个单元格包含播放器(类型为ThreeDCubePlayer).ThreeDCubePlayer与DisplayableObject有不同的构造函数(它需要两个额外的参数),只有ThreeDCubePlayer具有我需要的GetMap()函数.所以,这是我到目前为止所做的:
ThreeDCubePlayer* cubePlayer = &((ThreeDCubePlayer &)m_ppDisplayableObjects[0]);
char mapEntry = GetMapEntry((int)*(cubePlayer->GetMapX()), (int)*(cubePlayer->GetMapY()));
Run Code Online (Sandbox Code Playgroud)
这是ThreeDCubeGame.cpp(控制地图和键盘输入的功能)的一部分.我遇到的问题是这两行都在编译时出现"非法间接"错误.我认为这个错误是当我尝试取消引用不是指针的东西时,我确信cubePlayer看起来像指针......
有没有人知道我应该做什么?
基本上我正在修改解析器以处理其他运算符.在我的更改之前,解析器的一部分看起来像这样:
parseExpRec e1 (op : ts) =
let (e2, ts') = parsePrimExp ts in
case op of
T_Plus -> parseExpRec (BinOpApp Plus e1 e2) ts'
T_Minus -> parseExpRec (BinOpApp Minus e1 e2) ts'
T_Times -> parseExpRec (BinOpApp Times e1 e2) ts'
T_Divide -> parseExpRec (BinOpApp Divide e1 e2) ts'
_ -> (e1, op : ts)
Run Code Online (Sandbox Code Playgroud)
T_Plus等是Token数据类型的成员,Plus,Minus等是BinOp的一部分,BinOpApp应用于两个操作数.我更新了Token和BinOpApp数据类型以处理Power(取幂)令牌.这是结果代码:
parseExpRec e1 (op : ts) =
let (e2, ts') = parsePrimExp ts in
case op of
T_Plus -> parseExpRec (BinOpApp Plus e1 e2) ts' …Run Code Online (Sandbox Code Playgroud) 我正在尝试将一些为MSVC编写的代码移植到Clang上进行编译.然而,它似乎在找到一些模板功能时遇到了问题.以下是给我带来问题的结构定义的一部分:
template< typename T > struct FixedVector
{
T * ptr;
size_t count;
typedef T value_type;
FixedVector():ptr(0),count(0) {}
~FixedVector()
{
DeleteArr(ptr); // Error message appears here
count=0;
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
该DeleteArr(ptr)函数指的是稍后定义的函数,如下所示:
template< typename T > inline void DeleteArr( T *& ptr )
{
delete[] ptr;
ptr = NULL;
}
Run Code Online (Sandbox Code Playgroud)
这是我在指示的行上显示的错误消息:
error: call to function 'DeleteArr' that is neither visible in the template definition nor found by argument-dependent lookup
Run Code Online (Sandbox Code Playgroud)
查看错误的完整下拉列表(在Xcode中),以下消息位于列表的底部:
'DeleteArr' should be declared prior to the call …Run Code Online (Sandbox Code Playgroud) 我希望在没有停机的情况下重命名 PostgreSQL 中的列。我的代码将取决于列名,因此我想使用新名称以及现有列的内容和数据类型复制该列,然后在删除原始列之前推送代码更改。是否有用于将列及其内容复制到同一个表中的 Postgres 命令?
我正在制作一个网页,其中我有一个产品列表,以及每个产品旁边的一个字段,其中客户要输入他们想要订购的数量.产品列表是从数据库生成的,因此产品数量未知.是否有办法将每种产品的数量与每种产品的ID(来自数据库)一起发布?
谢谢
本
我在Haskell中定义了一个Tree数据类型,并在一个关联的'size'方法中计算了树中元素的数量.这之前有用,但我更新了Tree数据类型以使用命名字段,如下面的定义:
data Tree a = Empty
| Leaf {value::a}
| Node {left :: (Tree a), value :: a, right :: (Tree a)}
deriving (Eq, Ord, Show)
Run Code Online (Sandbox Code Playgroud)
我发现(通过在GHCi中玩游戏)我可以使用函数(左n)访问命名字段.但是,当我尝试使用此功能时,我收到一个错误:
size :: Tree a -> Int
size Empty = 0
size (Leaf l) = 1
size (Node n) = size (left n) + 1 + size (right n)
Run Code Online (Sandbox Code Playgroud)
GHCi简单地说"不在范围内:左边"和等同于右边.Tree定义位于名为Tree的模块中,大小定义位于名为Main的模块中,但是对于非命名字段,从Tree数据类型访问变量时,我从未遇到过范围问题.
我想创建一个自定义UITableViewCell子类,使用URL连接异步加载内容.我有一个处理所有这些的UITableViewCell子类和一个定义单元格布局的Nib文件,但是我在连接这两个时遇到了麻烦.这是我正在使用的代码tableView:cellForRowAtIndexPath:
static NSString *FavCellIdentifier = @"FavCellIdentifier";
FavouriteCell *cell = [tableView dequeueReusableCellWithIdentifier:FavCellIdentifier];
if (cell == nil)
{
cell = [[[FavouriteCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:FavCellIdentifier] autorelease];
}
cell.requestURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@?%@=%i", URL_GET_POST_STATUS,
URL_PARAM_SERIAL,
[[self.favourites objectAtIndex:indexPath.row] intValue]]];
return cell;
Run Code Online (Sandbox Code Playgroud)
这为UITableViewCell子类提供了一个请求URL,该子类处理setRequestURL方法中的加载.
在FavouriteCell类中,我保持initWithStyle:reuseIdentifier:方法不变,并且在Nib中我将FavCellIdentifier设置为标识符,将FavouriteCell设置为类.现在我如何让FavouriteCell类加载Nib?
我一直在尝试为 Xcode 中的自定义字符串类型创建自定义数据格式化程序。以下代码为我获取字符串中第一个字符的地址:
def MyStringSummary(valobj, internal_dict):
data_pointer = valobj.GetChildMemberWithName('AllocatorInstance').GetChildMemberWithName('Data')
print data_pointer.GetValue()
Run Code Online (Sandbox Code Playgroud)
这会打印出指针地址。当我查看该地址的内容时,我可以看到用于存储该数据的宽字符,所以我想我要做的就是将此指针转换为指向wchar_t,然后我就得到了第一个字符。我的第一个方法是这样的:
if data_pointer.TypeIsPointerType():
mychar = data_pointer.Dereference()
print mychar.GetValue()
else:
print "data_pointer is not a pointer!"
Run Code Online (Sandbox Code Playgroud)
这证实了 data_pointer是一个指针,但Dereference()调用似乎没有解决任何问题:mychar.GetValue()只是返回None。另一个问题 - 然后我是否能够通过循环并data_pointer每次增加固定数量的地址并继续取消引用并找到下一个字符,然后将其添加到输出字符串中?如果是这样,我将如何做到这一点?
编辑:
为了帮助澄清这个问题,我将发布一些关于字符串底层数据结构的信息。该定义太长,无法在此处发布(它也继承了它从通用数组基类所做的大部分功能),但我将提供更多详细信息。
查看StringVar.AllocationInstance.Data指针位置时,我可以看到我们为每个字符使用了 16 位。我正在查看的字符串中的所有字符都只有 8 位,每个字符后面还有 8 位 0。所以,这就是我在调试器中执行此操作时发生的情况:
(lldb) p (char*)(StringVar.AllocatorInstance.Data)
(char *) $4 = 0x10653360 "P"
(lldb) p (char*)(StringVar.AllocatorInstance.Data)+1
(char *) $6 = 0x10653361 ""
(lldb) p (char*)(StringVar.AllocatorInstance.Data)+2
(char *) $7 = 0x10653362 …Run Code Online (Sandbox Code Playgroud)