考虑这个将列表中所有元素加倍的函数:
doubleMe [] = []
doubleMe (x:xs) = (2*x):(doubleMe xs)
Run Code Online (Sandbox Code Playgroud)
然后考虑表达式
doubleMe (doubleMe [a,b,c])
Run Code Online (Sandbox Code Playgroud)
很明显,在运行时,这首先扩展为:
doubleMe ( (2*a):(doubleMe [b,c]) )
Run Code Online (Sandbox Code Playgroud)
(很明显,因为据我所知,没有其他可能性存在).
但我的问题是:为什么现在这个扩展到了
2*(2*a) : doubleMe( doubleMe [b,c] )
Run Code Online (Sandbox Code Playgroud)
代替
doubleMe( (2*a):( (2*b) : doubleMe [c] ) )
Run Code Online (Sandbox Code Playgroud)
?
直觉上,我知道答案:因为Haskell很懒惰.但有人可以给我一个更准确的答案吗?
是否有一些特殊的关于导致这种情况的列表,或者这个想法比仅仅列表更通用?
hello/ 忽略我的文件夹结构中任何位置名为"hello"的所有文件夹
hello/* 只忽略顶层的文件夹"hello".
为什么是这样?请指出http://git-scm.com/docs/gitignore中解释此行为的段落.
我有一本关于AppleScript的书,我想知道我是否应该保留.我已经了解JavaScript.
据我所知,Apple最近在OS X中添加了JavaScript脚本支持.
这是否意味着我不再需要学习AppleScript来为OS X应用程序编写脚本,还是比它更多呢?你的想法将不胜感激.
上述问题是从想要让应用程序自动执行操作的应用程序用户的角度出发的.
关于应用程序开发人员(Cocoa)的事情怎么样?如果他们想让他们的应用程序可编写脚本,他们可以不学习AppleScript吗?
更新:添加了赏金.问题被重新定义(对AppleScript及其用户没有任何不尊重):鉴于我已经了解JavaScript,我还有什么理由学习AppleScript吗?您对此事的详细想法将不胜感激.
考虑最简单的scotty应用程序:
{-# LANGUAGE OverloadedStrings #-}
import Web.Scotty
import Data.Monoid (mconcat)
main = scotty 3000 $ do
get "/:word" $ do
beam <- param "word"
html $ mconcat ["<h1>Scotty, ", beam, " me up!</h1>"]
Run Code Online (Sandbox Code Playgroud)
我将此代码放入app.hs并使用GHC进行编译.我用它来运行它./app.简单.
当人们访问该网站时会发生什么?它只是一个./app正在运行的.每当每个用户触发get "/:word" $ do一行时,是否在同一个应用程序中创建了新的线程?有多少这样的线程可以存在?千?万?
运行./app后显示消息Setting phasers to stun... (port 3000) (ctrl-c to quit).但它没有显示更多.它不会输出传入的Web请求.我该怎么做呢?这对于记录目的很有用.
了解你Haskell的谈论foldl'作为一种替代foldl,因为foldl很容易出现堆栈溢出.
foldl (+) 0 (replicate 1000000 1)应该堆叠溢出,但它不在我的机器上.为什么不?即使我将这个数字增加到1000万也不会溢出.它只占用大量内存,直到我的OS X计算机无法使用,我必须重新启动它.foldl而不是foldl'?根据我的经验foldl'"只是工作",而foldl基本上可能会崩溃我的电脑(见上文).foldr.为什么不能foldr堆栈溢出,为什么没有foldr'?当我遇到一个函数时,是否有一种通用的方法来确定它是完全独立的还是类型类的一部分?例如:
fromIntegral :: (Integral a, Num b) => a -> b
Run Code Online (Sandbox Code Playgroud)
这是我为找到答案而开发的方法:
:info对所有列出类的限制,在这种情况下:info Integral和:info Num.forIntegral).我的方法听起来好吗?它一般有效吗?
这是我的scotty应用程序,请注意我如何将请求记录到控制台:
{-# LANGUAGE OverloadedStrings #-}
import Web.Scotty
import Network.Wai.Middleware.RequestLogger
import Data.Monoid (mconcat)
main = scotty 3000 $ do
--log requests to console
middleware logStdoutDev
get "/:word" $ do
beam <- param "word"
html $ mconcat ["<h1>Scotty, ", beam, " me up!</h1>"]
Run Code Online (Sandbox Code Playgroud)
我的scotty app使用代理机制在nginx后面运行.这导致scotty应用程序像这样记录:
127.0.0.1 - - [27/Aug/2014:15:12:00 +0000] "GET / HTTP/1.0" 200 - ...
Run Code Online (Sandbox Code Playgroud)
我希望记录REAL IP ADDRESS.
我在我的Node.js/Express应用程序中遇到了同样的问题,我解决了这个问题:
我如何在Scotty中解决这个问题?
我有这个功能
doubleMe :: Num a => [a] -> [a]
doubleMe [] = []
doubleMe (x:xs) = (2*x):(doubleMe xs)
Run Code Online (Sandbox Code Playgroud)
考虑一下:
doubleMe(doubleMe([1,2,3]))
Run Code Online (Sandbox Code Playgroud)
显然,第一步是
doubleMe(doubleMe([1,2,3])) = doubleMe(2:doubleMe[2,3])
Run Code Online (Sandbox Code Playgroud)
因为没有其他可能性.
这是我想知道的下一步.究竟是为什么
doubleMe(2:doubleMe[2,3]) = 4:(doubleMe(doubleMe([2,3])))
Run Code Online (Sandbox Code Playgroud)
代替
doubleMe(2:doubleMe[2,3]) = doubleMe(2:4:doubleMe([3]))
Run Code Online (Sandbox Code Playgroud)
?
到目前为止我唯一能够提出的答案是
因为它有道理.否则Haskell不会在列表上懒散地行事.
但这不是一个答案,而是一个问题.真正的答案是什么?
我需要帮助将OO概念转换为Haskell.
想象一Vehicle类和Car和Truck亚类,具有driveOneMile一个返回双表示使用的总燃料的方法.每次调用driveOneMile也会改变车辆的内部状态.
这是我到目前为止在Haskell中所做的事情(因为在Haskell中没有实例变量,似乎我必须创建自己的"状态"类型):
type CarState = (Double,Double)
initialCarState = (0,0)
driveCarOneMile :: CarState -> (Double,CarState) --Double: total fuel used
driveCarOneMile s = ...
--the internal state of trucks is more complex. needs three Doubles
type TruckState = (Double,Double,Double)
initialTruckState = (0,0,0)
driveTruckOneMile :: TruckState -> (Double,TruckState)
driveTruckOneMile s = ...
Run Code Online (Sandbox Code Playgroud)
以类似的方式,我可以构建其他车辆及其"驱动"功能.
这就是我开车两次的方式:
fuelFor2Miles = fst $ driveCarOneMile $ snd $ driveCarOneMile initialCarState
Run Code Online (Sandbox Code Playgroud)
以fromIntegral功能为例:
fromIntegral :: (Integral a, Num b) => a -> b
Run Code Online (Sandbox Code Playgroud)
检查是否:
IntegralNum我们可以:info fromIntegral用来找出答案.
结果证明它是独立的.
但为什么?为什么它不成为Integral或Num类型类(或其他类型类)的一部分?这有什么好的理由还是更多的品味问题?
在设计我自己的自定义类型类和函数时,这个例子的答案将帮助我回答相同的问题.
haskell ×8
haskell-wai ×2
haskell-warp ×2
scotty ×2
applescript ×1
cocoa ×1
fold ×1
git ×1
gitignore ×1