haskell中fmap, liftM, mapM, traverse历史问题记录

问题

fmapliftM看起来做了相同的事,只是类型约束不同,实现上也不一样,但结果是一样,且后者的实现,可以归约到前者。那为什么使用了两种不同的命名,分别实现?同样的还存在于mapMtraverse等地方。

资料

so: traverse archive

so: fmap archive

wiki: amp archive

说明

简单来说就是历史问题,以前的Monad等并没有受Functor约束,在2010的Haskell中已经改正了,但因为历史因素没有删除这些多余的命名。在使用中,推荐使用约束最少的那一个,比如说fmap和liftM,使用fmap。虽然实现上会有点区别,但最后的结果应该是一致的。

nixos install

记录几个nixos安装时的问题。

  1. 关闭bios的secure boot,这是windows强制默认开启的,但这会导致U盘无法启动
  2. 关闭fastboot,这也是windows的,这会导致内核模块iwlwifi无法被加载,从而无法使 用无线网络

nix derivation

今天在想要不要把home-manager内的zsh plugins换成impurer的fetch时想到的问题。nix derivation是怎么计算hash的,为什么使用fetchFromGethub这类由stdenv定义的fetchur就没有问题,而原装的就不行呢?

简单来说就是看源代码。

调试器与软件启动过程

起因很简单,在弄emacs的调试器,然后想到的问题。本文主要思考了CC、haskell、python与ruby的调试器。在IDE中,在源代码窗口中打断点其实就相当于在对应上下文或调试器启动时,增加给编译器或解释器使用的中断信息,如C语言中的调试用宏,lldb/gdb/ghci中break相关命令的参数,ruby中的byebug等。

haskell caf

haskell中,会对特定的form进行缓存。从而产生出了一些使用无穷列表等方案的技巧,用于缓存运行结果。避免重复计算。最典型的例子就是斐波那契数。

foldl,foldr,foldl’

fold是合并列表等重要的操作,其中主要有foldr和foldl,也即从右向左和从左向右。一般来说,后者会优于前者。但在haskell中,并不是这样。