相关疑难解决方法(0)

使用静态类型语言清理和类型安全的状态机实现?

我在Python中实现了一个简单的状态机:

import time

def a():
    print "a()"
    return b

def b():
    print "b()"
    return c

def c():
    print "c()"
    return a


if __name__ == "__main__":
    state = a
    while True:
        state = state()
        time.sleep(1)
Run Code Online (Sandbox Code Playgroud)

我想把它移植到C,因为它不够快.但是C不允许我创建一个返回相同类型函数的函数.我试过制作这种类型的功能:typedef *fn(fn)()但它不起作用,所以我不得不使用一个结构.现在代码非常难看!

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

typedef struct fn {
    struct fn (*f)(void);
} fn_t;

fn_t a(void);
fn_t b(void);
fn_t c(void);

fn_t a(void)
{
    fn_t f = {b};

    (void)printf("a()\n");

    return f;
}

fn_t b(void)
{
    fn_t f = {c};

    (void)printf("b()\n");

    return f; …
Run Code Online (Sandbox Code Playgroud)

c python language-agnostic haskell typing

25
推荐指数
5
解决办法
2606
查看次数

`mfix`没有按预期工作

我希望以下代码首先提示start:,然后等待用户响应,然后回显之前的用户响应,并等待新的响应:

import System.IO (hFlush, stdout)
import Control.Monad.Fix (mfix)

f :: [String] -> IO [String]
f = mapM $ \x -> putStr x >> putStr ": " >> hFlush stdout >> getLine

g x = f ("start":x)

main = mfix g
Run Code Online (Sandbox Code Playgroud)

但它thread blocked indefinitely in an MVar operation在输入第一行后给出错误.

为什么这个以及如何解决它(请原谅双关语)?

monads haskell

5
推荐指数
2
解决办法
230
查看次数

标签 统计

haskell ×2

c ×1

language-agnostic ×1

monads ×1

python ×1

typing ×1