使用组合和部分应用程序haskell添加值

时间:2017-07-19 23:04:50

标签: haskell composition partial-application

我正在尝试使用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

1 个答案:

答案 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)

因此我们获得了上一个命令中的状态。