让我们用数据构造函数

时间:2012-06-06 09:51:27

标签: haskell

我有这些陈述:

data SL a = SR (Integer -> (a, Integer))
    deriving(Show)

instance Monad SL where
    return k = SR (\st -> (k, st))

xx::SL Integer
xx = return 4

然后我这样做:

let SR f = xx

现在我有:

xx :: SL Integer
f :: Integer -> (Integer, Integer)

但我不明白为什么。也许我错过了let DATACONSTRUCTOR ..的句法意义。

你能帮忙吗?

2 个答案:

答案 0 :(得分:8)

let SR f = xx表示SR f应该等于xx。所以,

SR f = xx                   -- let
     = return 4             -- def. xx
     = SR (\st -> (4, st))  -- def. return

因此

f = \st -> (4, st)  -- remove SR on both sides

,在此上下文中,由于Integer -> (Integer, Integer)SR :: a -> Integer -> (a, Integer)而属于xx :: SL Integer类型。

答案 1 :(得分:5)

letwhere也是模式匹配,例如case,但只有一个替代方案。例如,let表达式:

let SR f = xx in ...

类似于以下case表达式:

case xx of
  SR f -> ...

大多数人只是使用letwhere来执行简单的变量绑定,因此他们没有意识到它们是模式匹配。但是,变量绑定只是模式匹配的一种特殊情况(模式匹配中的标识符匹配所有内容并将值绑定到变量)。

此外,大多数模式匹配需要多个替代方案,因此let不适用。即使您只想匹配特定的构造函数,执行不完整的模式匹配也不是一个好主意。但是,在某些情况下,一个替代方案是完全匹配,例如,元组匹配(x, y),或者,就像您的情况一样,只有一个构造函数的数据类型。