StupidBeauty
Read times:382Posted at:Thu Mar 1 19:22:19 2012
- no title specified

外星人用的语言激荡咯本座的幼小心灵

本座是从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业的产品震精过咯。

Your opinions
Posted at:Sun Mar 4 07:59:40 2012砖家看着挺不错的
Posted at:Sun Mar 4 09:38:06 2012admin是啊,砖家,Haskell威力强大。看着挺不错的
Your name:Email:Website url:Opinion content:
- no title specified

HxLauncher: Launch Android applications by voice commands

 
Recent comments
2017年4月~2019年4月垃圾短信排行榜Posted at:Thu Sep 26 04:51:48 2024
Qt5.7文档翻译:QWebEngineCookieStore类,QWebEngineCookieStore ClassPosted at:Fri Aug 11 06:50:35 2023盲盒kill -9 18289 Grebe.20230517.211749.552.mp4