小编ben*_*wad的帖子

在Haskell中创建多态递归类型

我正在尝试在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',但它似乎不起作用.是否有另一个系统使这些类型多态?

polymorphism recursion haskell

5
推荐指数
2
解决办法
3179
查看次数

Haskell:打印出元组列表的内容

基本上我需要做的是编写一个函数,它接受一个类型列表[(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)

有什么我做错了吗?

haskell

4
推荐指数
3
解决办法
7935
查看次数

转换指向子类的指针(C++)

我正在开发一款游戏,我需要找到一种方法来获取游戏中某个"地图块"的值(以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看起来像指针......

有没有人知道我应该做什么?

c++ pointers

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

Haskell:在模式匹配中添加新行时出现语法错误

基本上我正在修改解析器以处理其他运算符.在我的更改之前,解析器的一部分看起来像这样:

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)

compiler-construction parsing haskell

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

模板定义找不到我的功能

我正在尝试将一些为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)

c++ scope clang visual-c++

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

将列复制到 PostgreSQL 中的同一个表

我希望在没有停机的情况下重命名 PostgreSQL 中的列。我的代码将取决于列名,因此我想使用新名称以及现有列的内容和数据类型复制该列,然后在删除原始列之前推送代码更改。是否有用于将列及其内容复制到同一个表中的 Postgres 命令?

database postgresql copy

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

从HTML表单中发布任意数量的记录

我正在制作一个网页,其中我有一个产品列表,以及每个产品旁边的一个字段,其中客户要输入他们想要订购的数量.产品列表是从数据库生成的,因此产品数量未知.是否有办法将每种产品的数量与每种产品的ID(来自数据库)一起发布?

谢谢

html php mysql post

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

访问Haskell函数中的命名字段

我在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数据类型访问变量时,我从未遇到过范围问题.

haskell ghci

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

使用自己的Nib对UITableViewCell进行子类化

我想创建一个自定义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?

interface-builder uitableview ios

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

LLDB Python 脚本中的指针运算

我一直在尝试为 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)

c++ python xcode pointers lldb

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