Haskell 让我们使用数据构造函数

Haskell 让我们使用数据构造函数,haskell,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) 但我

我有以下声明:

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..
的语法含义


你能帮忙吗?

让srf=xx
表示
srf
应该等于
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
其中
也是模式匹配,就像
case
,但只有一种选择。因此,例如一个
let
表达式:

let SR f = xx in ...
case xx of
  SR f -> ...
类似于下面的
案例
表达式:

let SR f = xx in ...
case xx of
  SR f -> ...
大多数人只是使用
let
where
进行简单的变量绑定,所以他们没有意识到它们是模式匹配。然而,变量绑定只是模式匹配的一种特殊情况(模式匹配中的标识符匹配所有内容并将值绑定到变量)

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