说我有
enum Foo { Foo0, Foo1, Foo2 };
Run Code Online (Sandbox Code Playgroud)
请注意,没有显式声明的Foo常量值为3(它们是0,1和2).
以下是否调用未定义的行为?
Foo yay = (Foo) 3;
Run Code Online (Sandbox Code Playgroud)
特别注意3可能适合内部表示Foo.
为什么这个 Read 实例解析不一致?
import qualified Data.List as List
data Foo = Foo
instance Show Foo where
show _ = "Foo"
instance Read Foo where
readsPrec _ s = case List.stripPrefix "Foo" s of
Just rest -> [(Foo, rest)]
Nothing -> []
Run Code Online (Sandbox Code Playgroud)
这是预期的:
Test> reads "" :: [(Foo, String)]
[]
Run Code Online (Sandbox Code Playgroud)
这是出乎意料的:
Test> read "" :: Foo
Foo
Run Code Online (Sandbox Code Playgroud)
我希望它会抛出。
我有一个抽象的Handle <T>类,它包含类型为T的对象的引用.我希望能够将该类转换为Handle <U>,其中U是T的超类.我会使用继承,但这不起作用.我该怎么做呢?什么是好的选择?
示例伪代码:
template<class T>
class Handle {
public:
virtual ~Handle () {}
virtual T & operator* () const = 0;
virtual T * operator-> () const = 0;
virtual template<class U> operator Handle<U>* () const = 0; // being lazy with dumb pointer
};
template<class T>
class ConcreteHandle : public Handle<T> {
public:
explicit template<class U> ConcreteHandle (U * obj) : obj(obj) {}
virtual ~ConcreteHandle () {}
virtual T & operator* () const {
return *obj;
}
virtual …Run Code Online (Sandbox Code Playgroud) 我有以下代码:
test :: String -> Bool
test "g" = True
test "global" = True
test _ = False
Run Code Online (Sandbox Code Playgroud)
当我加载到GHCi(7.0.3)时,我得到:
Warning: Pattern match(es) are overlapped
In an equation for `test': test "g" = ...
Run Code Online (Sandbox Code Playgroud)
这是一个错误还是我错过了什么?
以下举行:
test "" == False
test "g" == True
test "gl" == False
test "global" == True
test "globalx" == False
Run Code Online (Sandbox Code Playgroud)
更新:
我在用{-# LANGUAGE OverloadedStrings #-}.
使用reverse_iteratorwith 是否合法std::equal?
例如,这些合法吗?
std::equal(v.begin(), v.end(), w.rbegin())
std::equal(v.rbegin(), v.rend(), w.begin())
std::equal(v.rbegin(), v.rend(), w.rbegin())
Run Code Online (Sandbox Code Playgroud) 将字符串文字与另一个字符串文字与==运算符(或!=)进行比较时,结果是否已明确定义?
例如,以下是否保证可以保留?
assert("a" == "a");
assert("a" != "b");
Run Code Online (Sandbox Code Playgroud)
请不要说"使用std :: string"之类的东西.我只想知道这个具体案例.
不标准的保证,std::less<MyEnumType>将责令MyEnumType仿佛值MyEnumType被强制转换为适当大小的整数类型?
enum MyEnumType { E1 = 0, E2 = 6, E3 = 3 };
Run Code Online (Sandbox Code Playgroud) 为了自动将代码从C++转换为C#,我希望有一个C#类(伪代码)
class Null {
public static implicit operator T (Null unused) {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
这在诸如此类的情况下非常有用
foo(T1 x) { ... }
foo(T2 x) { ... }
foo(null); // ambiguous
Run Code Online (Sandbox Code Playgroud)
出于某些原因,通常不可能以编程方式消除上述类型的歧义.例如
foo((T1)null); // Discovering T1 over T2 is not possible or really hard to do
Run Code Online (Sandbox Code Playgroud)
但如果我Null上面的课程,我可以通过编程方式添加
foo(Null x) {...}
Run Code Online (Sandbox Code Playgroud)
并生成
foo(new Null()); // not ambiguous
Run Code Online (Sandbox Code Playgroud)
诀窍是使用new Null()代替每个生成的null甚至
T1 x = new Null();
Run Code Online (Sandbox Code Playgroud)
编译x == null.
是否可以写这样的课程?
在函数中test,我遍历一个列表,从它的成员生成镜头,然后打印一些数据.当我使用有点的调用样式时,这可以工作.当我点免费时,它无法进行类型检查.
为什么会这样,我该如何解决这个问题呢?
对我来说,GHC并没有保留使用无点风格时排名较高f(镜头中)的信息Functor,但我不太确定.
我正在使用GHC 7.8.3
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TemplateHaskell #-}
import Control.Lens
import Control.Monad
import Data.List
import Data.Maybe
type PlayerHandle = String
data Player = Player { _playerHandle :: PlayerHandle }
makeLenses ''Player
data GameState = GameState { _gamePlayers :: [Player] }
makeLenses ''GameState
type PlayerLens = Lens' GameState Player
getPlayerLens :: PlayerHandle -> PlayerLens
getPlayerLens handle f st = fmap put' get'
where
players = st^.gamePlayers
put' player = let …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写代码以从元组链中删除空元组.编译器拒绝该程序:
码:
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverlappingInstances #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE TypeOperators #-}
infixr 9 :*
data a :* b = a :* !b
deriving (Show, Eq, Ord)
class Flatten a b | a -> b where
flatten :: a -> b
instance Flatten a a where
flatten = id
instance Flatten a b => Flatten (() :* a) b where
flatten (() :* y) = flatten …Run Code Online (Sandbox Code Playgroud)