里面的函数 let not Num

147*_*7pm 0 tree haskell let

我有这些

data Fruit = Peach | Apple | Pear | Lemon | Fig deriving (Show,Eq)
data FTree = Bud | Split FTree FTree | Flat Fruit FTree deriving (Show,Eq)
Run Code Online (Sandbox Code Playgroud)

这意味着计算输入的水果类型的出现次数

ftreeFOccurs cft ft =
  let ftFO Bud = 0
      ftFO (Flat frt ft) = if (frt == cft) then (1 + (ftFO ft)) else (ftFO ft)
      ftFO (Split ft1 ft2) = (Split (ftFO ft1) (ftFO ft2))
  in ftFO ft
Run Code Online (Sandbox Code Playgroud)

这将是一棵典型的树

Split (Split Bud Bud) (Flat Fig (Flat Lemon (Flat Apple Bud)))
Run Code Online (Sandbox Code Playgroud)

但是当我提交时,ftreeFOccurs我收到此错误

No instance for (Num FTree) arising from the literal `0'
    * In the expression: 0
      In an equation for `ftFO': ftFO Bud = 0
Run Code Online (Sandbox Code Playgroud)

然而,类似的功能,

ftreeHeight Bud = 0
ftreeHeight (Flat frt ft) = 1 + ftreeHeight ft
ftreeHeight (Split ft1 ft2) = deeper (1 + ftreeHeight ft1) (1 + ftreeHeight ft2)
                              where deeper t1 t2 = if (t1 >= t2) then t1 else t2
Run Code Online (Sandbox Code Playgroud)

作品。这是来自The Little MLer的 SML 问题的翻译,其中该occurs函数有一个 2 元组参数,其中水果和树通过递归进行......这似乎不像 Haskell 方式。但是我不确定为什么在 a 中有一个函数let会产生这种差异。

ama*_*loy 5

在您的函数中添加一些类型,以便 Haskell 可以更好地提示您出错的地方。如果没有类型,它将对您的意思进行假设,直到遇到矛盾为止,您将不知道哪个假设是错误的。

在这种情况下,令人困惑的是有时ftFO返回一个数字,有时它返回一个FTree. 这不是你想要的,但如果 Haskell 假设它FTree可以理解为一个数字,那么在技术上是允许的。所以 Haskell 继续这个想法一段时间,直到它发现没有人说过如何解释FTree为一个数字。

  • 更好的是“ftFO(拆分 ft1 ft2)= ftFO ft1 + ftFO ft2”。正确的... (2认同)