为什么这些工作
let x = seq { for i in 1 .. 10 do yield i }
let x = seq { for i in 1 .. 10 -> i }
let x = seq { for i = 1 to 10 do yield i }
Run Code Online (Sandbox Code Playgroud)
但这一个不?
let x = seq { for i = 1 to 10 -> i }
Run Code Online (Sandbox Code Playgroud) 根据这个问题,Haskell的第1章隐含了第二条Functor法:
1st Law: fmap id = id
2nd Law : fmap (g . h) = (fmap g) . (fmap h)
Run Code Online (Sandbox Code Playgroud)
反之亦然吗?从第二定律开始,设定g相等id,我可以推理以下内容并获得第一定律吗?
fmap (id . h) x = (fmap id) . (fmap h) x
fmap h x = (fmap id) . (fmap h) x
x' = (fmap id) x'
fmap id = id
Run Code Online (Sandbox Code Playgroud)
哪里 x' = fmap h x
我为我的场景写了一个简单的例子.我创建了一个记录类型Switch
type State =
| On
| Off
with
member this.flip =
match this with
| On -> Off
| Off -> On
type Switch = { State : State }
Run Code Online (Sandbox Code Playgroud)
然后我写了一个函数,它创建了一个元素更改的记录副本
let flip switch = { switch with State = switch.State.flip }
Run Code Online (Sandbox Code Playgroud)
要flip很多次连续写我
let flipMany times switch =
[1 .. times]
|> List.fold (fun (sw : Switch) _ -> flip sw) switch
Run Code Online (Sandbox Code Playgroud)
如果我想把这两个函数作为方法放在记录上,我会写
type Switch =
{ State : State }
member this.flip =
{ this …Run Code Online (Sandbox Code Playgroud) 有一个F#等价的Haskell scanl/ scanr?这些函数执行折叠,但它们以列表的形式报告所有中间累加器状态.