我正在研究“ 九十九个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])。)
解决此问题的一种方法是将手动实现(->) ((->) …
我试图理解shell如何更好地处理重定向.我的理解是语法"n <"意味着重定向由"n"给出的文件描述符.
我正在努力理解的命令是
echo "first" > test; echo "second" 1< test
Run Code Online (Sandbox Code Playgroud)
我认为会发生的是文件"test"将被文本"first"覆盖; 然后,当执行第二个命令时,1 - 即stdout - 将被重定向到测试.
实际发生的是以下内容:
谁能解释一下发生了什么?是stdout被重定向到测试但是在"只读"模式或类似的东西?我找不到1<在其他地方使用脚本的任何参考(因为,诚然,这似乎是一件奇怪的事情).