我正在尝试使用Haskell编写此函数应用组合和部分应用程序:
<div id="1"></div><div id="2"></div><div id="3"></div><div id="4"></div><div id="5"></div><br>
<div id="6"></div><div id="7"></div><div id="8"></div><div id="9"></div><div id="10"></div><br>
<div id="11"></div><div id="12"></div><div id="13"></div><div id="14"></div><div id="15"></div><br>
<div id="16"></div><div id="17"></div><div id="18"></div><div id="19"></div><div id="20"></div><br>
<div id="21"></div><div id="22"></div><div id="23"></div><div id="24"></div><div id="25"></div><br>
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.5.11/p5.min.js"></script>
<script src="../sketch.js"></script>
<script>
document.getElementsByTagName("div")[0].addEventListener("click", displayDate);
function displayDate() {
this.style.backgroundColor = 'red';
}
</script>
我试过这个:
function m n = (m^2) + n
答案 0 :(得分:4)
该方法的问题是(+)
是二元运算符。由于您将其放在点.
的右侧,因此它不会应用于左操作数。所以你写了:
function :: Num a => a -> a -> a
function m = (.) (m^2) (+) -- wrong
这是以下内容的缩写:
function m = \n -> ((m^2) ((+) n))
这意味着(+) n
会产生一个函数(n+)
,我们会将该函数应用于(m^2)
的结果,这没有多大意义。
但您可以简单地使用:
function :: Num a => a -> a -> a
function m = (+) (m^2)
或者:
function :: Num a => a -> a -> a
function m = ((m^2) +)
鉴于function m = (+) (m^2)
,如果我们对该函数应用n
,我们将获得:
((+) (m^2)) n
-> (+) (m^2) n
-> (m^2) + n
您可以进一步修改function
并删除m
参数,其中包含:
function :: Num a => a -> a -> a
function = (+) . (^ 2)
这是语法糖:
function :: Num a => a -> a -> a
function = (.) (+) (^2)
如果我们现在对该函数应用m
,它将评估为:
((.) (+) (^2)) m
-> (\x -> (+) ((^2) x)) m
-> (+) ((^2) m)
-> (+) (m^2)
因此我们获得了上一个命令中的状态。