毕达哥拉斯检查哈斯克尔

时间:2015-02-03 20:12:22

标签: haskell

最近开始使用Haskell,我遇到了一些基本问题。

我写了一个简单的程序来对一个名为'square'的变量进行平方。现在我正在尝试编写一个名为pyth的程序,它接受3个变量将它们全部输入正方形,然后将平方加到b平方以查看它是否等于c平方以确定它们是否形成毕达哥拉斯三元组。

square :: Int -> Int
square x = x*x

pyth :: Int -> Int -> Int -> Bool
pyth a b c
a = square a  
b = square b 
c = square c
a+b == c = True

2 个答案:

答案 0 :(得分:5)

你的问题并不是真的包含任何问题,但是从你写的内容来看,很明显你正在努力克服Haskell的语法。

我从你的代码中看到的猜测是,你将Haskell的模式匹配语法与命令式语言典型的一系列语句混合在一起。 您想要实现的目标可以通过以下方式完成:

square :: Int -> Int
square x = x*x 

pyth :: Int -> Int -> Int -> Bool
pyth a b c = a' + b' == c'
     where a' = square a  
           b' = square b 
           c' = square c

请注意,a'是Haskell中的常规变量,'是标识符中的有效字符。此示例与将函数编写为:

相同
pyth :: Int -> Int -> Int -> Bool
pyth a b c = (square a) + (square b) == (square c)

如您所见,没有语句序列,函数是单个表达式。我们使用where从我们正在编写的表达式中提取子表达式,并为其提供可读性的名称或避免重复,但这并不意味着它们将按顺序进行评估或者其中一个是结果。即使你这样写了:

pyth :: Int -> Int -> Int -> Bool
pyth a b c = result
    where a' = square a
          b' = square b
          c' = square c
          result = a' + b' == c'

这是一个单独的表达式,它可以按任何顺序编写。如下所示:

pyth :: Int -> Int -> Int -> Bool
pyth a b c = result
    where result = a' + b' == c'
          a' = square a
          b' = square b
          c' = square c

我建议通过Learn you a haskell。这对初学者来说是一个非常好的资源。

答案 1 :(得分:4)

您正在制作语法错误。您pyth函数的正确版本如下所示:

pyth :: Int -> Int -> Int -> Bool
pyth a b c = a' + b' == c'
    where
      a' = square a  
      b' = square b 
      c' = square c

请注意,我更改了变量名称并添加了where块,用于存储平方值。在主函数体(a' + b' == c')中,您可以对毕达哥拉斯定理进行实际检查。