能否用Haskell的where从句根据函数输出反求输入?代码异常求解
Haskell代码死循环问题及函数反求输入的可能性
先看你给出的代码:
modify :: Integer -> Integer modify a = a + 100 x = x where modify(x) = 101
为什么打印x会卡顿?
这段代码里的x = x是无限递归定义,和你想的“反求函数输入”完全不沾边。where块里的modify(x) = 101不是在“指定modify的输出为101求输入”,而是定义了一个局部的modify函数——这里的x是这个局部函数的参数(和外层的x重名了),不管传什么参数都返回101。而外层的x被定义成等于自身,GHCi计算x时会无限递归,自然就卡死了。
Haskell能不能根据函数输出反求输入?
Haskell本身没有自动根据输出反推输入的能力:
- 不是所有函数都可逆,比如如果有个函数
f a = a * 0,给定输出0,你根本没法确定唯一输入; - 就算函数可逆(比如你的
modify是a→a+100,逆运算就是输出减100),你也得自己手动实现逆逻辑,Haskell不会自动帮你解等式。
如果想得到满足modify x = 101的x,直接写x = 101 - 100就行,这才是正确的写法,而不是靠你代码里那种错误的定义方式。
内容的提问来源于stack exchange,提问作者Devanshu Linux
相关产品推荐
相关产品推荐

