【问题标题】:Substitute n in [x|x<-[1..n]]在 [x|x<-[1..n]] 中替换 n
【发布时间】:2015-10-16 13:58:26
【问题描述】:
test n = (sum s)*4+2*(n-1)*((l')^2)-2*(n-1)*(l')
    where 
      p =sort $[ m | a<-[1..(n-1)],b<-[1..(n-1)],let m= (b/a), (a^2+b^2< (n^2))]
      l'= length p
      s = (product a) : next a (group p)
        where 
          a = [(n-1),2*(l')+(n-2)] 
          next [x,y] (z:z':zs) = case (null zs) of
            False -> (x')*(y')*l : next [x',y'] (z':zs)
            True -> (x')*(y')*l :[]
            where 
              l  = length z
              x' = x+l
              y' = y-length z'

为什么上面的代码会报如下错误:

没有因使用“/”而产生的 (Fractional Int) 实例 在表达式中:(b / a)

在“m”的等式中:m = (b / a)

在‘($)’的第二个参数中,即

 ‘[m |
    a <- [1 .. (n - 1)],
     b <- [1 .. (n - 1)],
     let m = (b / a),
    (a ^ 2 + b ^ 2 < (n ^ 2))]’

但是当我在代码中手动替换 n=3 时:

test' = (sum s)*4+2*(3-1)*((l')^2)-2*(3-1)*(l')
    where 
      p = sort $[ m | a<-[1..(3-1)],b<-[1..(3-1)],let m= (b/a), (a^2+b^2< (3^2))]
      l'= length p
      s = (product a) : next a (group p)
        where 
          a = [(3-1),2*(l')+(3-2)] 
          next [x,y] (z:z':zs) = case (null zs) of
            False -> (x')*(y')*l : next [x',y'] (z':zs)
            True -> (x')*(y')*l :[]
            where 
              l  = length z
              x' = x+l
              y' = y-length z'

然后就可以在GHCi中运行了;发生了什么事?

【问题讨论】:

  • 你可能会发现有趣的是,类型理论家通常证明他们的系统的一件事是 beta 减少尊重类型;也就是说,如果(\x -&gt; e) e' 可以被赋予类型t,那么e[e'/x](我们在e 的任何地方用e' 替换x 的术语)也可以被赋予类型t。但是,相反的情况通常不正确:e[e'/x] 的类型可能比 (\x -&gt; e) e' 多。特别是当e' 是多态的——就像你的例子中的3——但被函数应用程序强制为单态。

标签: haskell monads


【解决方案1】:

当你输入n 时,你用你的表达式强制它变成Int。因此,ba 变成了Ints,这在a/b 中出现了问题。

当您编写3 时,多态文字允许一些表达式使用Int,而另一些则使用其他一些Fractional a =&gt; a。在该函数中使用的 3s 只是不同的值。

创建一个不同的值,例如 nP = fromIntegral n should allow you to use n in every context,因为 nP 不应该被任何表达式僵化。

【讨论】:

  • 只有当你为nP写一个类型签名(或禁用单态限制)时,最后一句话才是真的。
  • @ReidBarton 我想单态性限制是为了避免意外这样做而设置的。
  • 这回答了问题,但似乎并没有解决此代码的各种问题,例如在范围内使用非整数是相当可疑的。
  • @dfeuer 是的。我现在无法扩展它,但将来会尝试。不过,我鼓励您编写自己的答案;我承认我只关注“什么”,而不是“为什么”部分,
猜你喜欢
  • 1970-01-01
  • 2022-06-10
  • 1970-01-01
  • 2023-04-04
  • 2013-12-26
  • 2020-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多