函数组合、交互和 hackerrank 练习

function composition, interact and hackerrank exercises

我是 Haskell 的新手,我现在正在 youtube 上观看 "Haskell Rank" 系列,我觉得我需要更好地了解第一个视频中发生的事情,这样我才能继续上。

他从 hackerrank 上的基本“先解决我”练习开始,解决方案已随附:

solveMeFirst a b = a + b

main = do
    val1 <- readLn
    val2 <- readLn
    let sum = solveMeFirst val1 val2
    print sum

这很清楚,如果我把它放在一个文件中,编译它并 运行 它,它的行为符合预期:


通过几个步骤解释每个函数的作用,他得出了一个更实用的单行解决方案;
他首先要完成以下工作:

> show $ sum $ map read $ words "1 2"
3

到这里为止,我明白了一切,包括 ($) 运算符的使用。

最后,他定义了 main 函数,使用 interact 处理来自 stdin 的输入,有两件事我真的不明白:

1 - 函数组合:然后他得出解决方案:

main = interact $ show . sum . map read . words

他抓取之前的构建,删除输入 "1 2" 以组成将成为 interact 参数的函数。而且,他没有彻底解释的是“并将其所有美元符号替换为功能组合。”

希望详细解释这个“反转”过程。

2 - 使用这一单行解决方案,并从文件编译它,

我如何 运行 文件,将输入发送为 args

转换为合成基于 . 运算符的简单定义(此处显示使用 $ 使 link 清晰)。

(.) f g = \x -> f $ g x

show . sum . map read . words 等同于 \x -> show $ sum $ map read $ words x.

组合函数从未显式应用于参数,因为 interact 获取函数并生成一个 IO () 值,当运行时执行时,该值会将函数应用于还提供的参数由运行时。

运行时通过从标准输入读取来提供输入。