如何理解case表达式?
How to understand the case expression?
这个例子很直观。 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
代表什么
Haskell 使用两种数据结构来管理多个值:列表和元组。元组有固定的长度,不需要是同一类型:
(1, "2") :: (Int, String)
您还可以对元组的值进行模式匹配。举个例子:
nonBlank :: (Int, String) -> Bool
nonBlank tuple =
case tuple of
(0, _) -> False
(_, "") -> False
_ -> True
这一行声明了State
,它存储了一个函数,它接收一个参数和returns一个元组:
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
的类型是一个函数s -> (s, a)
时,那么就很清楚了t i0
returns 一个元组,您可以对其进行模式匹配。
这个例子很直观。 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
代表什么
Haskell 使用两种数据结构来管理多个值:列表和元组。元组有固定的长度,不需要是同一类型:
(1, "2") :: (Int, String)
您还可以对元组的值进行模式匹配。举个例子:
nonBlank :: (Int, String) -> Bool
nonBlank tuple =
case tuple of
(0, _) -> False
(_, "") -> False
_ -> True
这一行声明了State
,它存储了一个函数,它接收一个参数和returns一个元组:
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
的类型是一个函数s -> (s, a)
时,那么就很清楚了t i0
returns 一个元组,您可以对其进行模式匹配。