我写了越来越多的C应用程序,现在我想知道关于强制转换的东西.在C++中,动态强制转换是一种非常昂贵的操作(例如向下转换),但我甚至不知道静态转换.
在C中,我不得不写这样的东西:
assert ( p ); /* p is void* */
int v = *(int*)p;
Run Code Online (Sandbox Code Playgroud)
它是一个"C动态演员"吗?它static_cast<int*>(p)与C++ 完全相同吗?它要多少钱?
提前致谢.
我有一个名为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) 考虑:
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中删除字符串(删除前导/尾随字符)的任何内容,并且没有地方可以找到这样的strip或chomp函数(如果我错了,请纠正我).
我该怎么办?
我一直试图建立标记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) 我正试图在MinGW中为Haskell安装SDL,但我遇到了一些问题.cabal找不到C库,我不知道为什么.这里有一些信息:
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到两个PATH及LD_LIBRARY_PATH,仍然无法找到@!#*C库.你有好主意吗?
我正在寻找一些描述如何使用的示例或记录良好的读数Distribution.TestSuite.目前的haddock文档很差,用户指南也是如此.我想为项目编写测试并通过cabal运行它们.我不想要exitcode-stdio-1.0测试界面.
任何线索?
想象一下这样一个功能:
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,C和X都是普通的纯值.我更喜欢这样的bar功能:
bar :: X -> A -> B -> C -> IO ()
Run Code Online (Sandbox Code Playgroud)
并且Foo将bar使用该X值在函数中生成.如果我这样做:
let f = bar myX
Run Code Online (Sandbox Code Playgroud)
f :: A -> B -> C -> IO ().如果我多次调用该函数,X由于部分应用,该值保持不变,但由于它是一种IO效果,因此每次都会生成它.是否有一种 …
你知道如何对字符串进行延迟评估,就像在这个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)
任何的想法?谢谢.
我最近需要跨越一个列表,以便只查看一些元素.它有点过滤功能,但并不是那么简单.但首先,这是一个跨越的步伐.
跨越列表 - 或任何可遍历的类型 - 与折叠它相同,但丢弃一些经常遇到的元素(关于步幅值).我们摘掉一个元素,那么下一个值摘掉将成为未来步幅日之一.例如,如果我们跨步一个步幅值设置为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模块的一部分吗?我认为它可以帮助很多.
我正在寻找获得Windows机器上正在运行的进程(和服务)列表的最标准方法.重要的是不要使用«modern»东西,因为我会在旧服务器上部署该程序.
任何的想法?