通过不同模块Haskell传递信息

时间:2016-08-31 13:17:42

标签: haskell types module

如何在自己创建的数据类型中存储一些值。存储后,不同的模块应该可以访问这些值。

如果你能告诉我一些代码示例,那会很好,因为我在Haskell中很新

到目前为止我的代码: 第二个模块(没有主要内容)

data SimuInfo = Information {
                massSaved:: Double
                } deriving Show

initialization::  Double-> SimuInfo
initialization m  = Information{
                      massSaved = m
                    }

--a example function, which uses the data
example:: Double -> SimuInfo -> Double
example a information = 2* a * b
                    where
                    b = massSaved information

这是第一个模块中的代码,它使用数据类型:

import Simufunc -- the import of the 2nd module



example2 :: Double -> Double
example2 a  = example a Information

这是我收到的以下错误消息:

Couldn't match expected type ‘SimuInfo’
                with actual type ‘Double -> SimuInfo’
    Probable cause: ‘Information’ is applied to too few arguments
    In the second argument of ‘example’, namely ‘Information’
    In the expression: example a Information

提前致谢

1 个答案:

答案 0 :(得分:1)

错误消息通知您example2无效,因为您传递给example的第二个参数应该是Double,但您传递的是函数

example2 a  = example a Information

Information是一个构造函数,这意味着它也是一个以Double作为参数并返回SimuInfo值的函数。

你有initialization函数与Information构造函数做同样的事情:它是一个函数,它将Double作为参数并返回SimuInfo

因此,您需要更新example2以将缺少Double的{​​{1}}添加为Information的输入。以下是通过向example2添加另一个参数来实现此目的的示例:

example2 :: Double -> Double -> Double
example2 a infoVal = example a (Information infoVal)

上述内容也可以使用您的帮助函数initialization

编写
example2 :: Double -> Double -> Double
example2 a infoVal = example a (initialization infoVal)

如果您想拥有"默认"您可以从任何地方访问SimuInfo的值(类似于其他语言中的常量),您可以这样声明:

zeroedInformation :: SimuInfo
zeroedInformation = Information 0