小编Fab*_*184的帖子

太长的 Haskell 函数的简化

我编写了一个函数来通过 API 查询货币汇率。它工作正常,但代码太长且难以阅读。我认为有人能够帮助我简化这个过程,特别是因为有许多重复的模式和运算符,例如重复使用

编辑:我没有意识到绑定任何东西pure是绝对没用的!

... <&> (=<<) (something >>= pure) ...
Run Code Online (Sandbox Code Playgroud)

我刚刚开始学习 Haskell,因此不知道可以在这里使用的许多聪明的运算符/函数/镜头。

顺便说一句,我知道存在 do 符号。

forex :: (String, String) -> IO (Maybe (Scientific, UnixTime))
forex cp = (get ("https://www.freeforexapi.com/api/live?pairs=" ++ uncurry (++) cp) <&> decode . flip (^.) responseBody <&> (=<<) (parseMaybe (.: "rates") >>= pure) :: IO (Maybe (Map Key (Map Key Scientific)))) <&> (=<<) (Data.Map.lookup (fromString (uncurry (++) cp)) >>= pure) <&> (=<<) ((pure . toList) >>= pure) <&> (=<<) (pure . map snd >>= …
Run Code Online (Sandbox Code Playgroud)

haskell

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

在 C 函数调用之前,以任何方式(跨编译器、平台、libc 实现等)PUSH 内联汇编中的额外参数是否安全或可移植?

我写了一个函数来漂亮地打印一个数独,当然这个模式可以由一些循环生成,但我不想经历麻烦,所以这就是我想出的(前 5 个格式说明符只是参数) printf 本身被压入堆栈,并且在回车后将被覆盖)。

\n

虽然“它可以在我的机器上运行”,但我想知道这是否可以或可以移植到跨架构、编译器、libc 实现等工作?

\n

当然,根据目标平台,汇编代码可能需要进行一些调整,并且 printf 推送的参数数量取决于当前的 libc 实现。

\n
#define PUSH(x) asm volatile ("push %0" : : "m"(x) :)\n#define POP() asm volatile ("pop %%rax" : : : "rax")\n\nvoid print(void) {\n    for (uint8_t i = 1; i <= (9 * 9); ++i) {\n        PUSH(sudoku[(9 * 9) - i]);\n    }\n\n    printf("%hhd%hhd%hhd%hhd%hhd\\r\xe2\x95\x94\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x97\\n"\n           "\xe2\x95\x91 %hhd  %hhd  %hhd \xe2\x95\x91 %hhd  %hhd  %hhd \xe2\x95\x91 %hhd  %hhd  %hhd \xe2\x95\x91\\n"\n           "\xe2\x95\x91 %hhd  %hhd  %hhd \xe2\x95\x91 %hhd  %hhd  %hhd \xe2\x95\x91 %hhd  %hhd  %hhd …
Run Code Online (Sandbox Code Playgroud)

c assembly gcc x86-64 inline-assembly

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

标签 统计

assembly ×1

c ×1

gcc ×1

haskell ×1

inline-assembly ×1

x86-64 ×1