-1

这个例子非常直观。xs 有 3 种情况,分别是空列表、只有 1 个元素的列表和超过 1 个元素的列表。

describeList :: [a] -> String  
describeList xs = "The list is " ++ case xs of [] -> "empty."  
                                               [x] -> "a singleton list."   
                                               xs -> "a longer list." 

但是我迷失在下面的代码中

newtype State s a = StateOf{deState :: s -> (s, a)}

postInc :: State Int Int
postInc = StateOf (\i -> (i+1, i))

instance Monad (State s) where
    return a = pure a
    StateOf t >>= k = StateOf (\i0 -> case t i0 of
                                  (i1, a) -> deState (k a) i1)

我完全不知道代表i1什么a

4

1 回答 1

2

Haskell 使用两种数据结构来管理多个值:列表和元组。元组具有固定长度,不需要是同一类型:

(1, "2") :: (Int, String)

您还可以模式匹配元组的值。仅举一个例子:

nonBlank :: (Int, String) -> Bool
nonBlank tuple =
  case tuple of
    (0, _) -> False
    (_, "") -> False
    _ -> True

这一行声明State了一个函数,该函数接收一个参数并返回一个元组:

newtype State s a = StateOf{deState :: s -> (s, a)}

这一行定义>>=了这种类型的函数:

StateOf t >>= k = StateOf (\i0 -> case t i0 of
                              (i1, a) -> deState (k a) i1)

您可能对 感到困惑t i0,但实际上,当您了解类型t是 functions -> (s, a)时,很明显t i0返回一个元组,您可以对其进行模式匹配。

于 2018-07-18T05:27:40.823 回答