It works when loaded from file, but not when typed into ghci. Why?

后端 未结 2 770
小蘑菇
小蘑菇 2020-12-11 17:56

If I put the following 2 lines into foobar.hs

f 1 = 1
f x = f (x-1)

then

$ ghci
> :load foobar.hs
> f 5
1


        
相关标签:
2条回答
  • 2020-12-11 18:38

    The latter binding overrides the former. Use this in ghci:

    Prelude> :{
    Prelude| let f 1 = 1
    Prelude|     f x = f (x-1)
    Prelude| :}
    Prelude> f 5
    1
    

    Or, without the layout:

    Prelude> let f 1 = 1; f x = f (x-1)
    Prelude> f 5
    1
    
    0 讨论(0)
  • 2020-12-11 18:48

    You have to enter it all in on one line, or using :{ and :} to enter multiple lines:

    > let { f 1 = 1; f x = f (x - 1) }
    

    Or

    > :{
    >   let f 1 = 1
    >       f x = f (x - 1)
    >   :}
    

    When you use two let statements to define f, you are actually redefining f the second time, not adding to its definition. If you were to do

    > let x = 1
    > let x = 5
    

    Then, x would be 5, not 1. The same goes for functions. First, you define f as f 1 = 1. Next, you define f as f x = f (x - 1), which overwrites the previous definition for f.

    0 讨论(0)
提交回复
热议问题