haskell 中有 lambda 的地方
Where with lambda in haskell
我正在阅读 Graham Hutton "Progamming in Haskell"(剑桥出版社)的(伟大)书籍的第 2 版。
阅读 State Monad 部分时,我偶然发现了一个我给自己的小任务。
如何使用 where
而不是 let
重写以下内容?
type State = Int
newtype ST a = S (State -> (a, State))
instance Functor ST where
-- fmap :: (a -> b) -> ST a -> ST b
fmap g st = S (\state -> let (x, s') = app st state in (g x, s'))
我尝试了此代码的变体,但它不起作用:
instance Functor ST where
-- fmap :: (a -> b) -> ST a -> ST b
fmap g st = S (\state -> (g x, newstate))
where (x, newstate) = app st state
我知道它本身没有用,但我想知道是否可行以及如何实现。
let BINDINGS in EXPRESSION
是一个表达式,可以在任何允许表达式的地方使用。
where
仅附加到声明,而不附加到表达式。 \state -> ...
不是声明,因此您不能将 where
附加到它。您也不能将其附加到外部声明,因为那样 state
将不在范围内。
可能的解决方案:
instance Functor ST where
fmap g st = S f
where
f state = (g x, s')
where (x, s') = app st state
我们有一个局部声明f state = ...
,而不是匿名函数\state -> ...
,我们可以在其上附加一个where
子句,该子句可以访问state
。
我正在阅读 Graham Hutton "Progamming in Haskell"(剑桥出版社)的(伟大)书籍的第 2 版。
阅读 State Monad 部分时,我偶然发现了一个我给自己的小任务。
如何使用 where
而不是 let
重写以下内容?
type State = Int
newtype ST a = S (State -> (a, State))
instance Functor ST where
-- fmap :: (a -> b) -> ST a -> ST b
fmap g st = S (\state -> let (x, s') = app st state in (g x, s'))
我尝试了此代码的变体,但它不起作用:
instance Functor ST where
-- fmap :: (a -> b) -> ST a -> ST b
fmap g st = S (\state -> (g x, newstate))
where (x, newstate) = app st state
我知道它本身没有用,但我想知道是否可行以及如何实现。
let BINDINGS in EXPRESSION
是一个表达式,可以在任何允许表达式的地方使用。
where
仅附加到声明,而不附加到表达式。 \state -> ...
不是声明,因此您不能将 where
附加到它。您也不能将其附加到外部声明,因为那样 state
将不在范围内。
可能的解决方案:
instance Functor ST where
fmap g st = S f
where
f state = (g x, s')
where (x, s') = app st state
我们有一个局部声明f state = ...
,而不是匿名函数\state -> ...
,我们可以在其上附加一个where
子句,该子句可以访问state
。