开始自己学习编程语言的提示

2020.11.03

它可能是一篇技术文章,它与构思文章尽可能接近。

在计算机领域,有大量的编程语言,特定领域的语言,具有独特范式的库等。不一定要涵盖所有内容,但我认为经常有必要根据情况学习新知识。

本文是为那些具有编程经验以自行学习新语言的人提供的提示或想法的摘要。但是,将在下面的句子中进行总结。

“创建一个示例代码作为一组输入和输出,然后检查执行情况。”

此处的输入和输出始终引用相同的类型。使用REPL(Read-Eval-Print Loop,交互式环境)时支持交互式输入/输出,用于编译/脚本执行的标准输入/输出,用于文件操作的文件输入/输出,以及用于GUI的屏幕输出。这就像需要完成的各种输入。

让我们以Haskell为例。

使用REPL时

作为Haskell的处理系统的GHC具有称为GHCi的REPL,这是一种功能语言,因此可以轻松地解释和执行程序。例如,“ Hello,World!”(以及REPL的开始/结束)的显示可以如下执行。

C:\Users\TAKIZAWA Yozo>ghci
GHCi, version 8.10.2: https://www.haskell.org/ghc/  :? for help
Prelude> "Hello, World!"
"Hello, World!"
Prelude> :q
Leaving GHCi.

C:\Users\TAKIZAWA Yozo>

此时,您可能需要使用函数或语法进行输出。在Haskell中,具有副作用的操作“ I / O动作”之一是将自变量作为字符串输出,print并且可以获得与仅输入字符串时相同的显示。以这种方式编写时,对于Haskell的新手来说,字符串显示看起来像一个非常复杂的过程。实际上,这是真的(苦笑)。

Prelude> print "Hello, World"
"Hello, World"

Haskell是纯粹的功能语言之一,具有副作用的功能处理即没有假定使用相同自变量值的处理结果根据情况而变化的功能(参考透明性)。print是一个函数,但是字符串显示只是一个副作用,而不是经过一些处理后的返回值。而且print该函数的返回值没有特殊含义,与常规函数处理不同。这就是为什么它看起来很复杂的过程,并且该过程被定义和描述为与输入过程相同的“ I / O动作”之一的原因。

我想您想先学习基本语法等,然后再留下诸如… 在使用REPL的环境中,不必先只学习输出方法,并且在再次尝试学习输入法时一起学习将更容易理解。顺便说一下,可以在REPL中确认Haskell中的函数定义及其用法,如下所示,并且不需要输出方法。

Prelude> func x y = if x == y then "Yes" else "No"
Prelude> func "Hello" "World"
"No"
Prelude> a = "World"
Prelude> func a "Hello"
"No"
Prelude> func a "World"
"Yes"

用于编译/脚本执行

根据编程语言的不同,REPL(交互环境)可能不可用,并且只能进行编译和脚本执行。对于Haskell的GHC,根据使用环境的不同,可能只有编译器可用。

那时,我们首先不仅要记住输出方法,还要记住输入方法。对于Haskell,如果print除了显示功能之外还getLine使用单行字符串输入,则暂时只能输入和输出字符串。

main = do
  x <- getLine
  print x


$ ghc hello.hs
[1 of 1] Compiling Main             ( hello.hs, hello.o )
Linking hello ...
$ ./hello
Hello, World! (← 入力)
"Hello, World!"

在此,main表示要执行的第一个操作(类似于C语言的主要功能)。do是将从下一行记下的多个操作分组为多个块时使用的关键字之一。=“按”,“do阻止”main表示这是一个过程。

另外,如果是一个句子,则可能不需要将其设为一个块,因此,如果您只想显示“ Hello,World!”,则可以编写如下。

main = print "Hello, World!"


$ ghc hello.hs
[1 of 1] Compiling Main             ( hello.hs, hello.o )
Linking hello ...
$ ./hello
"Hello, World!"

它可以更简洁地表达,但是像REPL一样,我们如何继续检查函数定义以及如何使用它呢?如果您不知道输入方法,则必须嵌入各种参数的值并按如下所示执行它,并且很难使程序说明与显示结果相对应。还是将程序重写并重复执行?

func x y = if x == y then "Yes" else "No"
a = "World"

main = do
  print $ func "Hello" "World"
  print $ func a "Hello"
  print $ func a "World"


$ ghc func.hs
[1 of 1] Compiling Main             ( func.hs, func.o )
Linking func ...
$ ./func
"No"
"No"
"Yes"

在这里,$牙齿( )中的符号被省略,例如,print func a "Hello"编写和func,但print将能够解释这两种说法的,也print因为它只需要一个参数,以免错误(func a "Hello"),而不是封闭的,并$已被使用。

以下是getLine也使用的示例代码的示例。

func x y = if x == y then "Yes" else "No"

main = do
  a <- getLine
  b <- getLine
  print $ func a b


$ ghc func.hs
[1 of 1] Compiling Main             ( func.hs, func.o )
Linking func ...
$ ./func
"Hello" (← 入力)
"World" (← 入力)
"No"
$ ./func
"World" (← 入力)
"World" (← 入力)
"Yes"

当然,即使它是仅显示类型,您也可以添加描述以显示哪个描述是处理结果,以便于查看。但是,在上述示例的情况下,print由于总是出现换行符,因此有putStrLn必要单独使用它来显示相应的描述,或者如果您想a = "World"do块中编写代码,以使程序代码更易于理解let,使用还有更多要做的事情,而您确实要执行“下一步”。