我编写了一个函数来通过 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) 我写了一个函数来漂亮地打印一个数独,当然这个模式可以由一些循环生成,但我不想经历麻烦,所以这就是我想出的(前 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)