gpt4 book ai didi

haskell - 隐藏构造函数

转载 作者:行者123 更新时间:2023-12-04 13:41:54 25 4
gpt4 key购买 nike

我是 Haskell 的初学者。
假设 Rat 是整数或整数的分数类型。我想问一下,为什么要导出这个 Rat 的构造函数?

module RatNum(Rat,add1Rat,makeRat) where
infixl 5 :/
data Rat = Int :/ Int | Only Int deriving(Show)
add1Rat :: Rat -> Rat
add1Rat (a :/ b) = (a+b) :/ b
add1Rat (Only a) = Only (a+1)
makeRat :: Rat
makeRat = 1 :/ 1
makeORat :: Rat
makeORat = Only 1

在 GHCI 中:
Prelude> :l RatNum
[1 of 1] Compiling RatNum ( RatNum.hs, interpreted )
Ok, modules loaded: RatNum.
*RatNum> Only 5
Only 5
*RatNum> add1Rat (1:/3)
4 :/ 3
*RatNum> 7:/5
7 :/ 5

该模块尚未完成,我想隐藏 Rat 的构造函数。

最佳答案

这是因为您正在从 ghci 加载模块本身。在文件 Main.hs 中试用此代码在与 RatNum.hs 相同的目录中:

module Main where

import RatNum

f = Only 1

现在尝试加载 Main来自 ghci:
$ ghci Main.hs
GHCi, version 7.0.4: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
[1 of 2] Compiling RatNum ( RatNum.hs, interpreted )
[2 of 2] Compiling Main ( Main.hs, interpreted )

Main.hs:5:5: Not in scope: data constructor `Only'
Failed, modules loaded: RatNum.

解释

看看 this ghci manual page ,第 2.4.5 节。它解释说,GHCI 放入命令提示符的每个模块当前都在范围内;可见标识符正是那些在没有导入声明(引用)的 Haskell 源文件中可见的标识符。

您的命令提示符显示 RatNum因为您告诉 ghci 加载它,所以提示符在与该模块内相同的范围内工作。
在我的示例中,它仅被我实际加载的模块引用, Main ,因此我没有进入 RatNum的范围内.

当您实际编译(或通过 import s 引用)您的代码时,导出声明将按您的预期工作。

关于haskell - 隐藏构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12299818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com