小编Gil*_*esz的帖子

在Maybe的例子中有点不匹配

我有一个类的定义

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)

haskell

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

State Monad和'put'函数在Haskell中

关于State Monad的文件说:

put :: s -> m ()
Run Code Online (Sandbox Code Playgroud)

替换monad中的状态.

我无法理解.这是否意味着功能替换状态里面单子?第二个问题:为什么返回值是m ()和不是m s

haskell

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

在32位整数中找到最大值

有没有SSE/SSE2能够找到4位整数32位的最大/最小值的指令?我尝试搜索一些东西,但我发现只有16/8位的指令.提前致谢.

https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=max&expand=4465,4463,3278&techs=SSE,SSE2

assembly sse

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

获取信号量必须是原子的。Pintos 的 sema_down 安全吗?

这段代码来自 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 保证对齐的内存操作(对于字/双字/四字 - 它取决于)是原子的。但是,在这里,我不相信为什么它是原子的。

x86 multithreading interrupt atomicity pintos

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

匹配类型和单子.错误

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)

我无法理解为什么会出现错误以及如何修复它.请帮忙.

haskell

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

寻找JVM堆的分配

我已经运行了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)

jvm strace

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

Haskell中的递归lambda

让我们看看使用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))

请解释一下,也许扩展递归?

lambda haskell

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

预解码器和解码器。不同之处

我正在阅读Agner Fog的材料,我有一些疑问:

预解码器和解码器每个时钟周期可处理 16 字节或 4 条指令

  1. 解码器上下文中的预解码器是什么?
  2. 作者谈到了宏指令的缓存。我不知道为什么它有用,毕竟我们有缓存指令。什么是环回缓冲区?

  3. 什么是微操作融合和宏操作融合?

x86 assembly cpu-architecture micro-optimization

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

getelementptr类型后的预期逗号.LLVM

(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.怎么处理呢?

llvm

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

避免在foldM中使用do语句

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).我可以避免它并更简洁地写出来吗?(是的,我知道我可以用它来写它,>>=但我也考虑更好的东西.)

haskell

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