[Haskell简介]可以使用功能规划,福利和建立环境建设来完成什么

“我想学习一个函数类型。但是,我用强功能类型触摸了Haskell。但是,与现有的东西和沮丧太不同”
“我不知道如何利用这个地方我学到了这一点。”

那些可能很多的人?
此外,如果您当前是一组区域和集合,可能会更难以理解大纲,并无法理解无趣?
因此,在本文中,我们将解释来自Haskell环境建设的功能类型的概念和优点。

关于Haskell.

Haskell是一种编程语言,具有语法或机制,它强烈连同功能类型的功能类型编程语言。
目前,前端ELM是一种显着接受Haskell的影响的语言。
虽然我稍后会详细解释,但它的特征在于纯功能类型,其特征在于,接受许多功能功能和面向对象的写入。

什么是函数类型

首先,让我们解释可以说的函数类型。
功能类型概念以单词表示,以降低功能的副作用。
首先。当前编程在调用函数行为的部分中具有黑匣子的性质。
结果,我们不知道函数在哪里执行,并且不知道如何影响它,它导致了一个错误。至少我有很多心灵,其实经历。
让我们出去一点。

 

    $test = 10;
    function change(){
        $test = 100;
    }

    //main処理 
    change();
    print ($test) // 100

 

以上具有全局变量并通过功能进行更改。这很好,因为它是用一个集合写入,直到函数声明

//main処理 
    change();
    print ($test) // 100

如果它被改变函数的一部分被切断,那么改变功能是什么?我会觉得怀疑,我努力了解代码的轮廓。
这是功能的副作用及其负面影响。关键是它意味着在运行和执行函数后,它将影响除返回地点之外的部分。

当然,上面的例子可以通过适当的评论和命名约定在某种程度上涵盖,但是悲伤的人类是犯错误的创造性。
难以按照具体规则,人为错误的性质行事,并且由于检查错误的麻烦而成本会增加。
因此,简单地通过编程语法或强制函数的副作用来编写代码的代码,从而减少了这种功能的副作用的代码是函数的侧面思想。

Haskell(它的优点)

虽然较早,Haskell是限制现有面向对象写作的特征。
通过这样做,语言侧被迫不实现抗模式(副作用的效果太大且难以维持)。
因此,当您知道如何编写和思考Haskell时,它将强烈意识到不会有常规对象方向意识的副作用,特别是在设计和测试部件中
您可以利用其知识。

好吧,让我们介绍一个对象方向和其他语言的着名部分以及其他语言。

多变的

  • 1.我无法重新编码
  • 2.初始化只能完成一次
  • 3.延迟评估

这是符合其他功能语言的,但是重组的特征。
除此之外,我们还有一个称为延迟评估的独特机制。
这是一种机制,使得在需要该变量之前易于评估。

在此上下文中,Haskell可以执行前所未有的处理。
(它很容易成为无限循环,但...)

功能

  • 1.如何调用灵活的功能,例如左耦合的右键中间耦合
  • 2.完全增强函数到分支处理从模式匹配,防护跟防参数

让我们实际触摸这个功能的功能。这些具有分层或简化函数定义的函数调用函数。

单子

  • 1.隐瞒副作用影响的功能
  • 2.仅专门用于从1.1对象检索值的接口

我会分开解释一下。

什么是monad?

嗯,功能类型表示它会降低副作用,但有一个问题。
这是通过减少副作用,一些代码是多余的。

当然,作为一个故事,例如,每次执行函数时,数据库连接和文件读数都会影响某些状态变量,所有副作用都伴随着副作用。
这就是为什么全功能类型语言无法使用这些进程。
(虽然可能无法防止主要功能中的所有进程,但是迫使这些他妈的代码的编程语言太恶心)

因此,它是一个函数,如Monad或操作,似乎可以处理这些功能。
作为图像,它具有副作用(键有一些状态变量并更改它)以将功能从中缠绕以从那里获取值。
这种包装可以通过赋予副作用的范围来最大限度地减少影响。

当我只问这个故事时,可能会听到在课堂上封装。
事实上,想法本身是通过在特定范围内限制副作用来消除外部副作用的想法。
但是,这一点的特点是专门取出价值。

环境

让我们建立一个环境。
因为我想专注于这次解释的解释,
使用称为堆栈的工具。

这可以稳定且稳定,OS或Hakell版本之间的差异并启动Haskell。
如果设置已安全完成

UNIX(包括MAC)类型

curl -sSL //get.haskellstack.org/ | sh

或者:

wget -qO- //get.haskellstack.org/ | sh

请点击终端

Windows从以下官方文档下载Windows的安装程序
请开始。
//docs.haskellstack.org/en/stable/README/#how-to-install

如果您可以安全地安装它,

stack --version

您可以查看版本。

它是一个执行方法,

stack runghc `file-name`

准备一个名为test.hs的文件作为示例

main = do 
    print "hello world"

写作和终端

stack runghc test.hs

我们开始做吧。

"hello world"

如果显示它是成功的。

主功能

事实上,我们实际上将解释Haskell的语法。 
为了在尝试从一开始时记住一切时,我们将缩小并仅向靠近功能类型的概念进行解释。

让我们先定义一个函数。
Haskell是运行代表所有函数的第一个函数。
这被称为主要功能。

而且我写这样的。

main = do 
    // メイン関数処理

如果主函数处理是一行,请省略并应用此。

main = // メイン関数処理

在未来,除非另有说明,否则出现的过程在主要功能中写入。

多变的

宣言

因此,声明声明了变量和类型。

    variable :: Int 

初始化

您可以以这种方式添加值以初始化。由于HSKQLL具有类型推断,因此可以在不模压的情况下声明和初始化。

    variable = "string"

顶级变量

Haskell版像全局变量

variable = 100 * 5
main = do
    print variable

通过这种方式,您可以通过声明函数的范围来读取任何函数的值。

顺便提一下,这种Haskell在调用和调用性质时,在没有将存储区域中的价值存储在其他语言中的性质的情况下,评估表达式。
例如

variable = 100 * 5
print variable

如果是,则变量具有100 * 5的等式,而不会保存500的值。
评估打印变量中的变量,并传递给在控制台屏幕上显示函数的参数

此时,计算该值并输出值。
在这种关系中,Haskell可能被称为绑定,而无需说替代。

功能

让我们来看看我们的功能。
但是,我会看看它,因为它在主要功能中稍微磨损。
此外,只有特殊语法只有功能。
但是,这次我们仔细介绍了基本和特征的特征。

定义

在一行的情况下

function = // 処理

在多行的情况下

function = do
    // 処理

如果有一个论点

add x y = x + y
print (add 1 3)

称呼

宣言 和呼叫有争议

左耦合功能,右绑定

print (add 1 3)

虽然它是上半部分,但是Haskell以左边的参数顺序逐个评估,所以如果您写入打印添加1 3
函数按((打印添加)1)3的顺序评估。这将是一个错误。

因此,使用使函数+参数部分()或$的参数部分的操作员。
您指定以右侧的顺序评估以下函数,因此它将在Print $ Add 1 3中正常进行评估。

模式匹配

想要在特定参数下进行特定处理是非常自然的。
Haskell将其作为语法纳入其中。
模式匹配的分支处理根据参数是特定值的条件下。

printdata :: Integer -> String
printdata 10 = "ten"
printdata 100 = "hundred" 

variable = variable * 5
main = do
    print (printdata 10) 

警卫

保护基于一系列特定参数分支过程。

printdata :: Integer -> String
printdata num
    | num > 10  = "ten"
    | num > 100 = "hundred"
    | otherwise = "???"

variable = variable * 5
main = do
    print (printdata 10) 

从使用的变量的底部
| 式 = 値
分支处理的形式
如果它不适用于任何范围
| otherwise = 値
描述这个过程。

部分应用

面向对象的函数无法执行函数,除非所有必需的参数都可用。
但是,Haskell可以部分应用功能并生成它们。

main = do 
    print value 
    where 
        by3 = by 3
        value =  by3 4 --12

通过这种方式,您可以处理第一个参数以修复要生成新功能的值。

单子

我认为如果函数仅解释,则难以理解。
这一次,让我们从随机数写入值并在蒙多多返回返回字符的写入值。

import System.Random

randomNum = do
    number <- getStdRandom ( randomR (0,99)) :: IO Int
    case number of
        _
            | number > 50 -> return "high" :: IO String
            | otherwise -> return "low"  :: IO String

main = do
    print =<< randomNum
    var <- randomNum
    print var

您可以使用现有的随机数生成库来制作一个例子。

randomNum = do
    number <- getStdRandom ( randomR (0,99)) :: IO Int
    case number of
        _
            | number > 50 -> return "high" :: IO String
            | otherwise -> return "low"  :: IO String

如果它是50或更大,则上述部分返回一个字符串低,如果它是50或更大,并且它是50或更多。
结果返回为字符串。

应该检查一下

            | number > 50 -> return "high" :: IO String
            | otherwise -> return "low"  :: IO String

这是回报的一部分。
这定义了它作为Monad返回一个值,
randomnum不是一个功能,而是monad。

它是检索数据的以下部分。

main = do
    print =<< randomNum
    var <- randomNum
    print var

如您来看,它与使用唯一运算符的功能不同。
如果您只需取出值并绑定到变量

var <- randomNum

喜欢<-という演算子を使っています。

如果要将其提取到另一个函数的值,则

print =<< randomNum

使用唯一的操作员。

进一步研究

这次我只介绍了开发环境,Haskell等。
所以,我将把材料放在此之后详细研究。

教程

学会你一个哈克尔,非常好!
虽然它是英语,但它已准备好阅读示例和详细规格,所以只是阅读
我会学习。

演练哈斯克尔
它是用日语编写的Haskell的信息。
如果有的话,它接近文档,但在规范+示例代码的构建中很容易阅读。
我想只读轮廓,但我可以阅读它。

框架

Haskell仍然是一个小语言,但有几个框架。
作为公共办公室,前端 味噌
Web应用程序 是的
此外,现在主题榆树也受到Haskell的影响。

如果您认为您可能会这样做,我认为前端和服务器可以使用Haskell应用程序。

在最后

最后,虽然功能类型肯定很大,但它不是一个通用的甘蔗。
实际上,功能类型引起了关注,因此Haskell没有与主要语言相比的开发环境。
因此,如果您尝试将其带到项目中,您将无法通过更少的文件解决问题。
但是,在触摸函数类型时,当您触摸对象类型时,可以意识到它将意识到它不会由副作用出生,因此它将能够编写高度可维护的代码可测试。你可以够。

概括

怎么样
由于功能类型,Monad,地区和地区和区域是难以理解的,因此感觉障碍浪费升高,如果那些障碍降低,将会理解。

给这篇文章的人

assa

我正在京都做工程师。记得阿萨或八个。 主要业务是网络中的爱好。好的