首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell混淆Int与Int -> Int

Haskell混淆Int与Int -> Int
EN

Stack Overflow用户
提问于 2017-03-19 15:57:08
回答 1查看 152关注 0票数 3

我最近在Haskell遇到了一个奇怪的问题。下面的代码应该返回一个被裁剪成范围的值(如果它高于high,它应该返回high,如果它在low下面,它应该返回low

代码语言:javascript
复制
inRange :: Int -> Int -> Int -> Int
inRange low high = max low $ min high

错误信息是:

代码语言:javascript
复制
scratch.hs:2:20:
    Couldn't match expected type ‘Int -> Int’ with actual type ‘Int’
    In the expression: max low $ min high
    In an equation for ‘inRange’: inRange low high = max low $ min high

scratch.hs:2:30:
    Couldn't match expected type ‘Int’ with actual type ‘Int -> Int’
    Probable cause: ‘min’ is applied to too few arguments
    In the second argument of ‘($)’, namely ‘min high’
    In the expression: max low $ min high

难道不应该再争论一次并把它放高吗?我已经尝试过其他的可能性,比如:

代码语言:javascript
复制
\x -> max low $ min high x

代码语言:javascript
复制
\x -> max low $ (min high x)

在GHCI中尝试时,我得到以下错误:

代码语言:javascript
复制
<interactive>:7:5:
    Non type-variable argument in the constraint: Num (a -> a)
    (Use FlexibleContexts to permit this)
    When checking that ‘inRange’ has the inferred type
      inRange :: forall a.
                 (Num a, Num (a -> a), Ord a, Ord (a -> a)) =>
                 a -> a
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-19 15:59:30

($)被定义为:

代码语言:javascript
复制
f $ x = f x

所以你的例子实际上是:

代码语言:javascript
复制
max low (min high)

这是错误的,因为你真的想

代码语言:javascript
复制
max low (min high x)

使用功能组合,其定义为:

代码语言:javascript
复制
f . g = \x -> f (g x)

我们得到的工作示例\x -> max low (min high x)

代码语言:javascript
复制
\x -> max low (min high x)
== max low . min high -- by definition of (.)
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42888723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档