我在GHCI做以下事情:
:m + Data.Map
let map = fromList [(1, 2)]
lookup 1 map
Run Code Online (Sandbox Code Playgroud)
GHCI知道map是(Map Integer Integer).那么为什么它在Prelude.lookup和Data.Map.lookup之间声明模糊,当类型清楚时我可以避免吗?
<interactive>:1:0:
Ambiguous occurrence `lookup'
It could refer to either `Prelude.lookup', imported from Prelude
or `Data.Map.lookup', imported from Data.Map
> :t map
map :: Map Integer Integer
> :t Prelude.lookup
Prelude.lookup :: (Eq a) => a -> [(a, b)] -> Maybe b
> :t Data.Map.lookup
Data.Map.lookup :: (Ord k) => k -> Map k a -> Maybe a
Run Code Online (Sandbox Code Playgroud) 我正在尝试实现一个数据结构,如果我使用无穷大进行数字比较,那就简单了.请注意,这不是maxBound/minBound,因为值可以<= maxbound,但所有值都是<infinity.
没希望?
如果你搜索在Haskell中实现的跳过列表,你将找不到很多.它是一个需要随机数生成器的概率数据结构,这意味着任何这些结构都需要在IO monad中运行.
Haskell人员是否远离这些数据结构,因为它们不可能纯粹实现它们?Haskell如何处理它们?
Parsec旨在解析文本信息,但我发现Parsec也适合对包含条件段,无序段等的复杂格式进行二进制文件格式解析.
是否有能力做到这一点或类似的替代方案,这样做?如果没有,Haskell解析二进制文件格式的最佳方法是什么?
说我有
x = Just 2
Run Code Online (Sandbox Code Playgroud)
是否有一种方法(最好是内置机制/函数)在单个语句中使用x,这样如果它是Just,则自动解包并使用2,如果它是Nothing,则引发异常?
那是,
(f x) + 2 == 4
if x == Just 2
,如果是,则引发异常x == Nothing
.
@protocol Eating
@end
@interface Eat : NSObject<Eating>
{
}
- (id<Eating> *)me;
@end
@implementation Eat
- (id<Eating> *)me { return self; }
@end
Run Code Online (Sandbox Code Playgroud)
在上面的Objective-C代码中,为什么"返回self"导致"从不兼容的指针类型返回"警告?什么是不兼容的指针类型以及如何解决它?
考虑以下Erlang代码:
-module(testit).
-export([testit/0]).
testit() ->
Pid = spawn(fun testit_proc/0),
Pid ! final,
Pid ! one,
Pid ! two,
io:format("Root finished~n").
testit_proc() ->
receive
one -> io:format("One~n");
two -> io:format("Two~n")
end,
receive
one -> io:format("One~n");
two -> io:format("Two~n")
end,
receive
one -> io:format("One~n");
two -> io:format("Two~n");
final -> io:format("Final~n")
end,
io:format("Spawn finished~n").
Run Code Online (Sandbox Code Playgroud)
输出是:
Root finished
One
Two
Final
Spawn finished
Run Code Online (Sandbox Code Playgroud)
final
由于先前的接收模式与该消息不匹配,因此消息的处理基本上被推迟到最后一个接收块.
你如何使用Haskell的TChan做到这一点?
这有效:
data Wrapped a = Wrapped a
alpha :: IO s -> IO ()
alpha x = do
rv <- wrapit x
return ()
where
wrapit :: IO s -> IO (Wrapped s)
wrapit x' = do
a <- x'
return (Wrapped a)
Run Code Online (Sandbox Code Playgroud)
这不是:
data Wrapped a = Wrapped a
alpha :: IO s -> IO ()
alpha x = do
rv <- wrapit
return ()
where
wrapit :: IO (Wrapped s)
wrapit = do
a <- x
return (Wrapped …
Run Code Online (Sandbox Code Playgroud) 我正在使用延迟字节串读取大数据流,并且想要知道在解析它时是否至少有X个字节可用.也就是说,我想知道bytestring是否至少为X字节长.
调用length
它会导致整个流加载,从而破坏了使用延迟字节串的目的吗?
如果是,那么后续将是:如何判断它是否至少有X个字节而不加载整个流?
编辑:最初我在阅读文件的上下文中询问,但了解有更好的方法来确定文件大小.然而,我需要的终极解决方案不应该依赖于懒惰的字节串源.
我可以在哪里打电话给Erlang Retval = subprocess:call(["cmd", "arg1", "arg2", "arg3"])
?
如果我正在构建一个复杂的命令来执行,使用os:cmd/1可以很容易地逃避错误.比较Python的subprocess.call()方法,我传入一个字符串列表并知道它是逐字传递给子进程的,没有任何损坏.
谢谢.
haskell ×8
erlang ×2
binary ×1
bytestring ×1
coding-style ×1
concurrency ×1
infinity ×1
iphone ×1
map ×1
objective-c ×1
parsing ×1
protocols ×1
structure ×1
types ×1