Haskell安全货币示例

Haskell安全货币示例,haskell,Haskell,这位伟大的作家通过他们写得很好的博文,彻底说服我使用安全货币: Prelude> :m Data.Ratio Prelude Data.Ratio> 1 % 5 1 % 5 ... Prelude Data.Ratio Data.Text> :m +Money Prelude Data.Ratio Data.Text Money> :t dense dense :: Rational -> Maybe (Dense currency) Prelude Da

这位伟大的作家通过他们写得很好的博文,彻底说服我使用
安全货币

Prelude> :m Data.Ratio

Prelude Data.Ratio> 1 % 5
1 % 5

...

Prelude Data.Ratio Data.Text> :m +Money

Prelude Data.Ratio Data.Text Money> :t dense
dense :: Rational -> Maybe (Dense currency)

Prelude Data.Ratio Data.Text Money> let y = 5 :: Integer
Prelude Data.Ratio Data.Text Money> :t y
y :: Integer
Prelude Data.Ratio Data.Text Money> y % 100
1 % 20
Prelude Data.Ratio Data.Text Money> :t it
it :: Ratio Integer
Prelude Data.Ratio Data.Text Money> let z = y % 100
Prelude Data.Ratio Data.Text Money> :t z
z :: Ratio Integer
Prelude Data.Ratio Data.Text Money> dense z

<interactive>:30:1: error:
    • No instance for (GHC.TypeLits.KnownSymbol currency0)
        arising from a use of ‘print’
    • In a stmt of an interactive GHCi command: print it

Prelude Data.Ratio Data.Text Money> fromRational z
5.0e-2
Prelude Data.Ratio Data.Text Money> :t it
it :: Fractional a => a

Prelude Data.Ratio Data.Text Money> fromRational z :: Dense "USD"

<interactive>:35:25: error:
    Illegal type: ‘"USD"’ Perhaps you intended to use DataKinds
Prelude Data.Ratio Data.Text Money> 'fromRational' z :: Dense "USD"

<interactive>:36:1: error:
    • Syntax error on 'fromRational'
      Perhaps you intended to use TemplateHaskell or TemplateHaskellQuotes
    • In the Template Haskell quotation 'fromRational'

<interactive>:36:27: error:
    Illegal type: ‘"USD"’ Perhaps you intended to use DataKinds
Prelude Data.Ratio Data.Text Money>  'fromRational' (341 % 100) :: Dense "USD"

<interactive>:37:2: error:
    • Syntax error on 'fromRational'
      Perhaps you intended to use TemplateHaskell or TemplateHaskellQuotes
    • In the Template Haskell quotation 'fromRational'

<interactive>:37:38: error:
    Illegal type: ‘"USD"’ Perhaps you intended to use DataKinds

但尝试GHCi中的示例和各种导入语句,我无法让它工作,甚至重新键入博客文章中的确切示例:

Prelude> :m Data.Ratio

Prelude Data.Ratio> 1 % 5
1 % 5

...

Prelude Data.Ratio Data.Text> :m +Money

Prelude Data.Ratio Data.Text Money> :t dense
dense :: Rational -> Maybe (Dense currency)

Prelude Data.Ratio Data.Text Money> let y = 5 :: Integer
Prelude Data.Ratio Data.Text Money> :t y
y :: Integer
Prelude Data.Ratio Data.Text Money> y % 100
1 % 20
Prelude Data.Ratio Data.Text Money> :t it
it :: Ratio Integer
Prelude Data.Ratio Data.Text Money> let z = y % 100
Prelude Data.Ratio Data.Text Money> :t z
z :: Ratio Integer
Prelude Data.Ratio Data.Text Money> dense z

<interactive>:30:1: error:
    • No instance for (GHC.TypeLits.KnownSymbol currency0)
        arising from a use of ‘print’
    • In a stmt of an interactive GHCi command: print it

Prelude Data.Ratio Data.Text Money> fromRational z
5.0e-2
Prelude Data.Ratio Data.Text Money> :t it
it :: Fractional a => a

Prelude Data.Ratio Data.Text Money> fromRational z :: Dense "USD"

<interactive>:35:25: error:
    Illegal type: ‘"USD"’ Perhaps you intended to use DataKinds
Prelude Data.Ratio Data.Text Money> 'fromRational' z :: Dense "USD"

<interactive>:36:1: error:
    • Syntax error on 'fromRational'
      Perhaps you intended to use TemplateHaskell or TemplateHaskellQuotes
    • In the Template Haskell quotation 'fromRational'

<interactive>:36:27: error:
    Illegal type: ‘"USD"’ Perhaps you intended to use DataKinds
Prelude Data.Ratio Data.Text Money>  'fromRational' (341 % 100) :: Dense "USD"

<interactive>:37:2: error:
    • Syntax error on 'fromRational'
      Perhaps you intended to use TemplateHaskell or TemplateHaskellQuotes
    • In the Template Haskell quotation 'fromRational'

<interactive>:37:38: error:
    Illegal type: ‘"USD"’ Perhaps you intended to use DataKinds

Prelude>:m数据比率
前奏曲数据。比率>1%5
1 % 5
...
序曲数据。比率数据。文本>:m+货币
序曲数据。比率数据。文本货币>:t
稠密::理性->可能(稠密货币)
前奏曲数据。比率数据。文本货币>让y=5::整数
序曲数据。比率数据。文本货币>:TY
y::整数
序曲数据。比率数据。文字货币>y%100
1 % 20
前奏曲数据。比率数据。文本货币>:t it
比率整数
序曲数据。比率数据。文本货币>让z=y%100
序曲数据。比率数据。文本货币>:tz
比率整数
序曲数据。比率数据。文本货币>密集z
:30:1:错误:
•没有(GHC.TypeLits.KnownSymbol currency0)的实例
因使用“打印”而产生
•在交互式GHCi命令的stmt中:打印它
序曲数据。比率数据。文本货币>来自Rational z
5.0e-2
前奏曲数据。比率数据。文本货币>:t it
它::分数a=>a
序曲数据。比率数据。文本货币>来自Rational z::稠密的“美元”
:35:25:错误:
非法类型:“'USD'”可能您打算使用DataTypes
序曲数据.比率数据.文本货币>'fromRational'z::稠密的“美元”
:36:1:错误:
•关于“fromRational”的语法错误
也许您打算使用TemplateHaskell或TemplateHaskell
•在模板中,Haskell引用“fromRational”
:36:27:错误:
非法类型:“'USD'”可能您打算使用DataTypes
序曲数据。比率数据。文本货币>'fromRational'(341%100)::密集的“美元”
:37:2:错误:
•关于“fromRational”的语法错误
也许您打算使用TemplateHaskell或TemplateHaskell
•在模板中,Haskell引用“fromRational”
:37:38:错误:
非法类型:“'USD'”可能您打算使用DataTypes
我希望像这样聪明的作者也能实用,包括初级到中级Haskeller的基本步骤

*package页面和github也是空的。有人能在这里提供一个使用
安全货币的工作示例吗?我当然被yesod文档中的完整示例宠坏了

我相信方案是这样的:

如前所述,您需要启用
datatypes
扩展

您可以在具有的文件中启用此扩展名

{-# LANGUAGE DataKinds #-}
您可以使用在GHCi中启用此功能

:set -XDataKinds
GHCi中提供的错误消息应该是一个很好的提示,提示您需要启用该扩展

非法类型:“'USD'”可能您打算使用DataTypes


通过浏览这里的搜索结果,它可能会帮助您查看更多的使用示例:

在会话开始时尝试
:set-XDataKinds
。而且我不知道
“fromRational”(341%100)
中的引号是怎么回事。在我所知道的任何哈斯克尔宇宙中都是无效的。