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)
中的引号是怎么回事。在我所知道的任何哈斯克尔宇宙中都是无效的。