函数组合、交互和 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 ()
值,当运行时执行时,该值会将函数应用于还提供的参数由运行时。
运行时通过从标准输入读取来提供输入。
我是 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 ()
值,当运行时执行时,该值会将函数应用于还提供的参数由运行时。
运行时通过从标准输入读取来提供输入。