【问题标题】:Haskell - problems with typesHaskell - 类型问题
【发布时间】:2015-05-23 13:06:12
【问题描述】:

我已经开始学习 Haskell 并且遇到了问题。我尝试理解 lambda 并创建函数 mo06

mo06 f x = if f x
           then x
           else x * x

我可以在 ghci 中调用它:

λ mo06 (== 1) 1
1
λ mo06 (== 1) 3
9 

没问题 - 没有问题也没有问题,但是......

...我想把我的函数写成

mo08 f = fac (\x ->  if f x then x else x * x)

在哪里

fac 表示阶乘:

fac :: Num a => Int -> Int
fac n
  | n == 0    = 1
  | n > 0     = n * fac (n-1)
  | otherwise = error "fac only defined on natural numbers"

并像以前一样调用它

mo08 (==1) 3

我尝试并得到一个错误:

无法将预期类型“a -> a”与实际类型“Int”匹配。

fac 更改为 (fromIntegr fac) 没有帮助。

谢谢。

【问题讨论】:

  • Num a 对你的 Int -> Int 函数的约束是没有意义的;只需将其删除。或者,从 Int -> Int 更改为 a -> a

标签: haskell types


【解决方案1】:

你必须将fac移入:

mo08 f = \xx -> fac (if f (xx) then xx else xx * xx)

或(如果您愿意)将xx 移动到= 的左侧:

mo08 f xx = fac $ if f (xx) then xx else xx * xx

看看为什么只看\xx -> ... - 这将是一个函数 - 这里需要一个Int 并产生一个Int - 与fac :: Int -> Int 相同 - 所以当你尝试fac (\xx -> ...) 时,你实际上是试图将一个函数插入fac(这就是错误试图告诉你的)——但如果你将fac移动到lambda的定义中,它将起作用。

使用合成

当然,也许您尝试使用函数组合:

mo08 f = fac . (\xx -> if f (xx) then xx else xx * xx)

但如您所见,您需要使用组合运算符(.) ;)

【讨论】:

    【解决方案2】:

    该 lambda 表达式(a -> a 类型)不是整数,但在 mo08 中,您尝试在其上调用 fac - 而 fac 期望 int。您需要在最终结果上调用fac

    mo08 f = (\xx -> fac (if f xx then xx else xx * xx))
    

    或者使用函数组合:

    mo08 f = fac . (\xx -> if f xx then xx else xx * xx)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-29
      • 2013-10-19
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多