我有一个类的定义
class Functor f => Pointed f where
pure :: a -> f a
Run Code Online (Sandbox Code Playgroud)
现在我想举例说明Maybe.为什么这不起作用?
instance Pointed (Maybe s) where
pure Nothing = Nothing
pure (Just a) = a
class Functor f where
fmap :: (a->b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)
错误是:
Kind mis-match
The first argument of `Pointed' should have kind `* -> *',
but `Maybe s' has kind `*'
In the instance declaration for `Pointed (Maybe s)'
Failed, modules loaded: none.
Run Code Online (Sandbox Code Playgroud) Run Code Online (Sandbox Code Playgroud)put :: s -> m ()替换monad中的状态.
我无法理解.这是否意味着功能替换状态里面单子?第二个问题:为什么返回值是m ()和不是m s
有没有SSE/SSE2能够找到4位整数32位的最大/最小值的指令?我尝试搜索一些东西,但我发现只有16/8位的指令.提前致谢.
这段代码来自 Pintos 源码:https : //www.cs.usfca.edu/~benson/cs326/pintos/pintos/src/threads/synch.c
void
sema_down (struct semaphore *sema)
{
enum intr_level old_level;
ASSERT (sema != NULL);
ASSERT (!intr_context ());
old_level = intr_disable ();
while (sema->value == 0)
{
list_push_back (&sema->waiters, &thread_current ()->elem);
thread_block ();
}
sema->value--;
intr_set_level (old_level);
}
Run Code Online (Sandbox Code Playgroud)
采取信号量的事实是sema->value--;。如果它有效,它必须是一个原子操作。我们怎么知道它实际上是原子操作?我知道现代 CPU 保证对齐的内存操作(对于字/双字/四字 - 它取决于)是原子的。但是,在这里,我不相信为什么它是原子的。
type C = StateT Int (ErrorT String IO)
main :: C ()
main = do
args <- liftIO $ getArgs
case args of
[] -> liftIO $ putStrLn "E"
(p:ps) -> s "d"
s :: String -> C ()
Run Code Online (Sandbox Code Playgroud)
我有错误:
Couldn't match type ‘Control.Monad.Trans.State.Lazy.StateT
Int
(Control.Monad.Trans.Error.ErrorT String IO)
()’
with ‘IO t0’
Expected type: IO t0
Actual type: C ()
In the expression: main
When checking the type of the IO action ‘main’
Run Code Online (Sandbox Code Playgroud)
我无法理解为什么会出现错误以及如何修复它.请帮忙.
我已经运行了straced JVM(OpendJDK 11):
strace -e trace=mmap java -Xms8192m Main
输出是:
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7effda5fa000
mmap(NULL, 2158880, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7effda1c3000
mmap(0x7effda3d1000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xe000) = 0x7effda3d1000
mmap(NULL, 246024, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7effda5bd000
mmap(NULL, 4131552, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7effd9dd2000
mmap(0x7effda1b9000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1e7000) = 0x7effda1b9000
mmap(0x7effda1bf000, 15072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7effda1bf000
mmap(NULL, 2212016, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7effd9bb5000
mmap(0x7effd9dd0000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b000) …Run Code Online (Sandbox Code Playgroud) 让我们看看使用lambda函数分析Haskell中的factorial代码:
y f x = f (y f) x
factorial = y (\t n -> if n == 1 then 1 else n * t(n-1))
Run Code Online (Sandbox Code Playgroud)
我无法理解它是如何工作的.我知道它与lambda演算有关,但是现在我对它并不熟悉,所以我必须在没有它或知识最少的情况下理解.我的疑问是:阶乘的定义是什么?我的意思是这个f:y f x = f(yf)x.
那么这里有什么?y(\ tn - >如果n == 1那么1其他n*t(n-1))
请解释一下,也许扩展递归?
我正在阅读Agner Fog的材料,我有一些疑问:
预解码器和解码器每个时钟周期可处理 16 字节或 4 条指令
作者谈到了宏指令的缓存。我不知道为什么它有用,毕竟我们有缓存指令。什么是环回缓冲区?
什么是微操作融合和宏操作融合?
(1) @str = private constant [13 x i8] c"Hello World\0A\00"
(2) define i32 @main(){
(3) %r2 = getelementptr [13 x i8]* @str, i32 0, i32 0
(4) ret i32 0
(5) }
Run Code Online (Sandbox Code Playgroud)
我在第3行遇到错误错误:expected comma after getelementptr's type.怎么处理呢?
g ll =
foldlM (\ some_list b -> do
part <- f b
return (some_list ++ part)) [] ll
Run Code Online (Sandbox Code Playgroud)
在上面的代码中我使用的do statement只是因为f函数返回monad类型: M awhere a是一个列表.(我用"解包"该列表<-.这就是我需要的原因do statement).我可以避免它并更简洁地写出来吗?(是的,我知道我可以用它来写它,>>=但我也考虑更好的东西.)