Haskell语言在参考透明度方面提供的确切承诺/保证是什么?至少Haskell报告没有提到这个概念.
考虑表达式
(7^7^7`mod`5`mod`2)
Run Code Online (Sandbox Code Playgroud)
我想知道这个表达式是否为1.为了我的安全,我会做两次这样做:
( (7^7^7`mod`5`mod`2)==1, [False,True]!!(7^7^7`mod`5`mod`2) )
Run Code Online (Sandbox Code Playgroud)
现在给出(True,False)了GHCi 7.4.1.
显然,这个表达现在是参考不透明的.如何判断程序是否受此类行为影响?我可以全部淹没程序,::但这并不能使它具有可读性.我之间是否还有其他类的Haskell程序?这是一个完全注释和未注释的之间?
(除了我在SO上找到的唯一有点相关的问题之外,还有其他一些问题)
假设我有一个内部数据类型,T a用于导出函数的签名:
module A (f, g) where
newtype T a = MkT { unT :: (Int, a) }
deriving (Functor, Show, Read) -- for internal use
f :: a -> IO (T a)
f a = fmap (\i -> T (i, a)) randomIO
g :: T a -> a
g = snd . unT
Run Code Online (Sandbox Code Playgroud)
不导出类型构造函数有T什么影响?它是否会阻止消费者干涉类型的值T a?换句话说,出口清单(f, g)和(f, g, T())这里有区别吗?
我正在尝试学习Haskell在学习你是一个Haskell的指导,但以下困惑我.
lucky :: (Integral a) => a -> String
lucky 7 = "LUCKY NUMBER SEVEN!"
lucky x = "Sorry, you're out of luck, pal!"
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,那里有一行说明函数的确切类型.但这有必要吗?参数和返回值的类型不能从该行下面的模式中推导出来吗?