小编pha*_*zon的帖子

C演员到底做了什么?

我写了越来越多的C应用程序,现在我想知道关于强制转换的东西.在C++中,动态强制转换是一种非常昂贵的操作(例如向下转换),但我甚至不知道静态转换.

在C中,我不得不写这样的东西:

assert ( p ); /* p is void* */
int v = *(int*)p;
Run Code Online (Sandbox Code Playgroud)

它是一个"C动态演员"吗?它static_cast<int*>(p)与C++ 完全相同吗?它要多少钱?

提前致谢.

c types casting

10
推荐指数
3
解决办法
2496
查看次数

使类成为另一个类的实例

我有一个名为Foo拥有函数的类gen :: Int -> [Foo].例如,我可以用Foo这种方式制作一个实例:

data FooTest = FooTest Int

instance Foo FooTest where
  gen n = replicate n (FooTest 0)
Run Code Online (Sandbox Code Playgroud)

现在,让我们假设我有另一个叫做Bar定义函数的类bar :: Bar -> IO ().每个实例Foo都必须是实例Bar,Bar每个实例的实现完全相同.这是一个例子:

class Foo f where
  gen :: Int -> [f]

class Bar b where
  bar :: b -> IO ()

instance Bar Foo where -- obviously that doesn’t work
  bar _ = putStrLn "bar through any Foo …
Run Code Online (Sandbox Code Playgroud)

haskell class instance

7
推荐指数
1
解决办法
514
查看次数

Let表达式如何在AST中起作用?

考虑:

data Expr a
  = V a
  | Lit Integer
  | Let (Expr a) (Expr (Maybe a))
    deriving (Eq,Show)
Run Code Online (Sandbox Code Playgroud)

Let构造使我以引用它在第二表达式(第一ARG)结合(V Nothing指它).

如果我做的事情

Let (Lit 3) $ Let (Lit 1) $ Var Nothing
Run Code Online (Sandbox Code Playgroud)

Lit也将Var Nothing是指什么?此外,我想一次性推广到多个绑定,我不知道如何做到这一点.我从杰出的爱德华·凯梅特(Edward Kmett)绑定包中得到了一些例子,但现在我既困惑又迷失了.

haskell abstract-syntax-tree name-binding

7
推荐指数
1
解决办法
180
查看次数

剥离左/右一个字符串(和chomp)

我没有找到关于如何在Haskell中删除字符串(删除前导/尾随字符)的任何内容,并且没有地方可以找到这样的stripchomp函数(如果我错了,请纠正我).

我该怎么办?

haskell

6
推荐指数
2
解决办法
2745
查看次数

正确标记AST

我一直试图建立标记AST一段时间.我们来介绍一下这个问题:

data E a
  = V a
  | LitInt Int
  | LitBool Bool
  | FooIntBool (E a) (E a) -- er…
    deriving (Eq,Show)
Run Code Online (Sandbox Code Playgroud)

对我来说,这段代码的问题在于FooIntBool.这个想法是它需要一个int表达式和一个bool表达式,并将它们粘合在一起.但E a可能是任何事情.鉴于以上定义,这将是有效的E:

FooIntBool (LitInt 3) (LitInt 0)
Run Code Online (Sandbox Code Playgroud)

你可以看到这个问题.然后,我们想要什么?标记的表达式.鉴于E的当前定义,这是不可能的,所以让我们介绍一些GADT:

data E :: * -> * -> * where
  V          :: a -> E l a
  LitInt     :: Int -> E Int a
  LitBool    :: Bool -> E Bool a
  FooIntBool :: E Int a -> E …
Run Code Online (Sandbox Code Playgroud)

monads haskell abstract-syntax-tree gadt name-binding

6
推荐指数
1
解决办法
162
查看次数

在MinGW中使用cabal编译SDL

我正试图在MinGW中为Haskell安装SDL,但我遇到了一些问题.cabal找不到C库,我不知道为什么.这里有一些信息:

  • 我已经下载了SDL1.2的dev和runtime库;
  • 对于开发版本,我make native吧:它安装在/usr/include/SDL/usr/lib;
  • 我尝试过cabal install SDL,它失败了,因为它找不到头文件和lib;
  • 然后,我再试一次cabal install SDL --extra-include-dirs=/usr/include/SDL --extra-lib-dirs=/usr/lib.它找到头文件但仍然不是lib;
  • 我复制的运行时库SDL.dll/usr/lib,仍然有同样的烦恼;
  • 最后,我添加/usr/lib到两个PATHLD_LIBRARY_PATH,仍然无法找到@!#*C库.

你有好主意吗?

haskell sdl mingw cabal sdl-1.2

5
推荐指数
0
解决办法
457
查看次数

需要一些关于Distribution.TestSuite的解释

我正在寻找一些描述如何使用的示例或记录良好的读数Distribution.TestSuite.目前的haddock文档很差,用户指南也是如此.我想为项目编写测试并通过cabal运行它们.我不想要exitcode-stdio-1.0测试界面.

任何线索?

haskell test-suite cabal

5
推荐指数
1
解决办法
263
查看次数

使用部分应用函数缓存内部

想象一下这样一个功能:

bar :: Foo -> A -> B -> C -> IO ()
Run Code Online (Sandbox Code Playgroud)

该函数IO使用a Foo和其他值执行一些操作.该Foo值必须传递给bar,并可以IO通过以下方式检索:

foo :: X -> IO Foo
Run Code Online (Sandbox Code Playgroud)

现在A,B,CX都是普通的纯值.我更喜欢这样的bar功能:

bar :: X -> A -> B -> C -> IO ()
Run Code Online (Sandbox Code Playgroud)

并且Foobar使用该X值在函数中生成.如果我这样做:

let f = bar myX
Run Code Online (Sandbox Code Playgroud)

f :: A -> B -> C -> IO ().如果我多次调用该函数,X由于部分应用,该值保持不变,但由于它是一种IO效果,因此每次都会生成它.是否有一种 …

closures caching haskell partial-application

5
推荐指数
1
解决办法
457
查看次数

C++中的懒惰11

你知道如何对字符串进行延迟评估,就像在这个D片段中一样:

void log(lazy string msg) {
  static if (fooBarCondition)
    writefln(…) /* something with msg */
}
Run Code Online (Sandbox Code Playgroud)

实际上,问题可能根本不需要懒惰,因为静态 if.也许有可能char const*在不使用时丢弃字符串?就像,在C++中:

void log(char const *msg) {
  #ifdef DEBUG
  cout << … << endl; /* something with msg */
  #else /* nothing at all */
  #endif
}
Run Code Online (Sandbox Code Playgroud)

任何的想法?谢谢.

c++ d lazy-evaluation c++11

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

没有步伐功能

我最近需要跨越一个列表,以便只查看一些元素.它有点过滤功能,但并不是那么简单.但首先,这是一个跨越的步伐.

跨越列表 - 或任何可遍历的类型 - 与折叠它相同,但丢弃一些经常遇到的元素(关于步幅值).我们摘掉一个元素,那么下一个值摘掉将成为未来步幅之一.例如,如果我们跨步一个步幅值设置为0的列表,我们实际上会使列表保持不变.如果我们将1列入一个列表,我们会得到两个元素:

stride 0 [1..10] == [1..10]
stride 1 [1..10] == [1,3,5,7,9]
stride 2 [1..10] == [1,4,7,10]
Run Code Online (Sandbox Code Playgroud)

我看着Data.List,我没有找到任何stride清单.这就是为什么我写了一个功能来跨越我 - 和你的!- 东西:

import Data.DList

-- for Data.List
stride :: (Num a, Eq a) => a -> [b] -> [b]
stride s = toList . snd . foldl (\(sa,xa) x -> if sa == s then (0,xa `snoc` x) else (sa+1,xa)) (s,fromList [])
Run Code Online (Sandbox Code Playgroud)

你可以像上面一样使用它.有可能建议它成为Data.List模块的一部分吗?我认为它可以帮助很多.

haskell list

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

Windows运行进程列表perl

我正在寻找获得Windows机器上正在运行的进程(和服务)列表的最标准方法.重要的是不要使用«modern»东西,因为我会在旧服务器上部署该程序.

任何的想法?

perl process monitor

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