小编jga*_*aeb的帖子

实现`(->)((->)ab)`为应用函子的最佳方法是什么?

我正在研究“ 九十九个Haskell问题”中的问题19 ,并且遇到了以下困难。问题要求“将列表向左旋转N个位置”。这很容易以明确的方式实现,例如

rotate :: [a] -> Int -> [a]
rotate xs n = drop n xs ++ take n xs
Run Code Online (Sandbox Code Playgroud)

但是,对于我自己的教育和挑战,我想使用应用函子以一种无意义的方式实现这一点。举例来说,一个可以消除一个通过事实的论据(->) [a]Applicative仿函数并实现rotate如下:

rotate :: Int -> [a] -> [a]
rotate n = (++) <$> drop n <*> take n
Run Code Online (Sandbox Code Playgroud)

理想情况下,一个人应该能够消除这两个参数,并将其写为

rotate :: [a] -> Int -> [a]
rotate :: (++) <$> drop <*> take
Run Code Online (Sandbox Code Playgroud)

但这会导致类型错误。(我不确定确切如何推断类型,但问题似乎出在推断的Applicative仿函数(->) Int不是的事实(->) ((->) Int [a])。)

解决此问题的一种方法是将手动实现(->) ((->) …

haskell applicative

4
推荐指数
2
解决办法
163
查看次数

"1 <"完成了什么?

我试图理解shell如何更好地处理重定向.我的理解是语法"n <"意味着重定向由"n"给出的文件描述符.

我正在努力理解的命令是

echo "first" > test; echo "second" 1< test
Run Code Online (Sandbox Code Playgroud)

我认为会发生的是文件"test"将被文本"first"覆盖; 然后,当执行第二个命令时,1 - 即stdout - 将被重定向到测试.

实际发生的是以下内容:

  1. 什么都没有写到终端,所以stdout被重定向到某个地方 ;
  2. 当我打开"测试"时,写的是"第一"而不是"第二",所以我没有覆盖"测试".

谁能解释一下发生了什么?是stdout被重定向到测试但是在"只读"模式或类似的东西?我找不到1<在其他地方使用脚本的任何参考(因为,诚然,这似乎是一件奇怪的事情).

zsh io-redirection

1
推荐指数
1
解决办法
52
查看次数

标签 统计

applicative ×1

haskell ×1

io-redirection ×1

zsh ×1