本座是从cjacker那里第一次听说Haskell的,他说他用Haskell写咯個浏览器。
后来又看到一篇勃客,那篇勃客里把各种语言比成不同的刀,其中把C++比成一個有大约100個刃的“巨型小刀”,而把Haskell比成飞碟,令本座印象深刻,于是本座就去了解咯一下。前辈们说Haskell是一种函数式语言,本座觉得翻译成功能式语言可能會合适一点。大概说的就是在用Haskell写程序的时候,只写自己的“意图”,而不用告诉它要怎么一步步的计算。由此引申出写Haskell程序就像写数学公式一样。
今天碰到一個方程要解,就想趁机试试Haskell咯。
方程其实很简单,就是解一個直角△的长边的长度,而短边的长度是长度的0.618倍,斜边长度是(768/2-2).
也就是:
x2+(x×0.618)2=(768/2-2)2
本座参考咯这里的写法,写成咯这样的:
main=print [x|x<-[0 ..(683 . 000)],(x^ 2 +(x* 0 . 618)^ 2)==(384 - 2)^ 2]
本座猜测,对于这样的式子,Haskell在内部应当是以一個循环来尝试可能值的。但是运行之后没有结果,一想,后面的条件是严格的“==”,可能因为误差,没有严格满足相等条件的x值。于是加上一個四舍五入“round”,写成这样的:
main=print [x|x<-[0 ..(683 . 000)],round(x^ 2 +(x* 0 . 618)^ 2)==(384 - 2)^ 2]
还是没有结果。又想,round只是允许在[-0.5,0.5)范围内的误差,是不是太小咯?那怎么办勒?想咯一下终于想到解决办法咯,加上一個误差范围变量就行咯,加個delta进去,写成这样:
main=print [(x,delta)|x<-[0 ..(683 . 000)],delta<-[- 1000 . 0 .. 1000 . 0],round(x^ 2 +(x* 0 . 618)^ 2 +delta)==(384 - 2)^ 2]
然后一编译、运行,果然有结果咯:
bash-4.0# ghc --make X2.hs
[1 of 1] Compiling Main ( X2.hs, X2.o )
Linking X2 ...
bash-4.0# ./X2
[(324.0,855.0),(325.0,-42.0),(326.0,-941.0)]
bash-4.0#
得到咯三個解:
x |
误差 |
324 |
855 |
325 |
-42 |
326 |
-941 |
外星人的语言真是好用。好久没这样被一個IT业的产品震精过咯。
HxLauncher: Launch Android applications by voice commands