在Haskell FP中定义和调用函数完成在线IDE

时间:2014-12-19 23:39:51

标签: haskell

这不是在Haskell中定义fpcenter函数的正确方法吗? :

-- | Main entry point to the application.
module Main where

-- | The main entry point.
main :: IO ()
main = do
    putStrLn "Welcome to FP Haskell Center!"
    putStrLn "Have a good day!"


let exp x n | n == 0 = 1
 | n == 0 = 1
 | n == 1 = x
 | even n = exp (x * x) m
 | odd n = x * exp (x*x) (m-1)
where m = n `div` 2

src/Main.hs@12:2-12:3 parse error on input |行显示| n == 0 = 1

添加到Prelude时正确定义了该功能。

更新:附上错误消息截图 -

enter image description here

1 个答案:

答案 0 :(得分:2)

let不用于顶级绑定(请查看main)。只需写下:

exp x n
 | n == 0 = 1
 | n == 1 = x
 | even n = exp (x * x) m
 | odd n = x * exp (x * x) (m - 1)
 where m = n `div` 2

此外,当您使用letlet - in时,它的绑定块遵循与do相同的布局规则 - 块必须缩进和块中的第一项一样多。人们通常以两种方式之一缩进事物:

let
  a = 2
  f x y
   | x < y = x
   | otherwise = y

let a = 2
    f x y | x < y = x
          | otherwise = y

我更喜欢前一种风格,因为它不需要经常更改空格。