最大链接。 Haskell的运营商

时间:2016-12-23 06:38:33

标签: haskell

我正在尝试使用.运算符编写一个带三个值并返回其最大值的函数。

显然,以下工作

max3 a b c = max a (max b c)
max3 a b c = max a $ max b c

但我想使用.。我试过了

max3 a b c = max a . max b c

但得到错误

Couldn't match expected type `a0 -> Float' with actual type `Float'
In the first argument of `max', namely `b'

我知道这个例子很愚蠢,但是正确的方法很好地解释以及为什么会非常感激。

2 个答案:

答案 0 :(得分:6)

回想myTextBox.setFocus(true); myTextBox.selectAll(); boolean success = copyToClipboard(); private static native boolean copyToClipboard() /*-{ return $doc.execCommand('copy'); }-*/;

的定义
(.)

你有表达式

(f . g) x = f (g x)
如果我们设置max a (max b c) (f . g) xf = max a

会匹配g = max b的右侧。在x = c定义的左侧使用这些替换,我们得到:

(.)

答案 1 :(得分:6)

让我们在你的第一个例子中介绍一些括号:

<!doctype html>
<html>
</head>
<body>
  <div class="widget-body" style="border: solid 1px black; height:45px; margin-bottom:10px;margin-right:20px;background:linear-gradient(to right, #85e2f0 5% , white 95%);">
  <div class="col-xs-2" style="height:45px; font-size: 28px;">
	<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
  </div>												
  <div class="col-xs-8" style="height:30px;text-align:center; border: solid 1px black;margin-top: 6px; display: flex; align-items: center;justify-content: center; background-color: #42d442;">test</div>												
  <div class="col-xs-2" style="height:43px; font-size: 27px; text-align: center;">
	<a data-toggle="dropdown">
      <span class="glyphicon glyphicon-menu-down" aria-hidden="true"></span>
    </a>
    <ul class="dropdown-menu" role="menu">
       <li><a href="#">Item 1</a></li>
       <li><a href="#">Another item</a></li>
       <li><a href="#">This is a longer item that will not fit properly</a></li>
    </ul>
  </div>
</div>
</body>
</html>

现在将其与上一篇文章进行比较:

max3 a b c = (max a) ((max b) c)

或者,如果我们在前缀表示法中写max3 a b c = (max a) . ((max b) c)

(.)

现在我们明白为什么你会得到这个错误。为了进行类型检查,max3 a b c = (.) (max a) ((max b) c) 需要是一个函数:

(max b) c

如果我们使用(.) :: (b -> c ) -> (a -> b ) -> a -> c max a :: Float -> Float max b c :: Float ^^^^^^^^^^^ 的约束版本,我们会收到更好的错误消息:

max

现在错误消息好多了:

maxFloat :: Float -> Float -> Float
maxFloat = max

max3 a b c = max a . max b c

话虽如此,让我们实际解决这个问题:

Couldn't match expected type ‘a0 -> Float’ with actual type ‘Float’
Possible cause: ‘maxFloat’ is applied to too many arguments
In the second argument of ‘(.)’, namely ‘maxFloat b c’
In the expression: maxFloat a . maxFloat b c

请注意,您也可以写

max3 a b c = max a ((max b) c)
           = (max a . max b) c