以下是Hutton的Haskell编程(p.102).
data Nat = Zero | Succ Nat
natToInt :: Nat -> Int
natToInt Zero = 0
natToInt (Succ n) = 1 + natToInt n
Run Code Online (Sandbox Code Playgroud)
如果我输入natToInt Zeroghci,我得到0.如果我输入natToInt (Succ Zero),我得到1.
但natToInt (Succ (Succ Zero))返回2.我在逻辑上理解它但我不明白它在这个语句中如何递归地工作.
内在的(Succ Zero)回归1?这意味着,在我看来,最外层采用1作为参数,这是不正确的,因为1不是Nat类型.那就是
natToInt (Succ ( 1 + 0)).
有人可以帮我理解吗?
map :: (a -> b) -> [a] -> [b]
map f xs = [f x | x <- xs]
Run Code Online (Sandbox Code Playgroud)
该定义来自Hutton的Haskell编程(第62页).
看看它的类型,我理解该函数如何获取作为函数的第一个参数和作为列表的第二个参数.
但上述成为类型(a -> b) -> ([a] -> [b])?等等map接受函数,并返回一个函数,[a]并返回[f x|x <- xs]?
为什么不(a -> b) -> [a] -> [b]代替(a -> a) -> [a] -> [a] ?
例如,这本书使用 map(+1)[1,3,5,7]
有人可以详细解释一下这个功能吗?