(我希望这个问题是关于主题的 - 我试图寻找答案,但没有找到明确的答案.如果这恰好是偏离主题或已经回答,请缓和/删除它.)
我记得听过/读过关于Haskell 几次是最好的命令式语言的半开玩笑的评论,这当然听起来很奇怪,因为Haskell通常以其功能特性而闻名.
所以我的问题是,Haskell的哪些特性/特性(如果有的话)有理由证明Haskell被认为是最好的命令式语言 - 或者它实际上更像是一个笑话?
factorial(n) = def $ do
assert (n<=0) "Negative factorial"
ret <- var 1
i <- var n
while i $ do
ret *= i
i -= 1
return ret
Run Code Online (Sandbox Code Playgroud)
factorial :: Integer -> Integer
factorial n = def $ do
assert (n >= 0) "Negative factorial"
ret <- var 1
i <- var n
while i $ do
ret *= i
i -= 1
return ret
Run Code Online (Sandbox Code Playgroud)
使用var = newSTRef
,规范定义 …
我是Haskell的新手,所以它可能是显而易见的,但我做了广泛的Prolog,所以我对这一个感到困惑......
使用GHCi时,我创建了以下函数(1):
Prelude> let find k t = head [v | (k',v) <- t, k == k'] -- Definiton of find
find :: Eq a1 => a1 -> [(a1, a)] -> a
Prelude> find 2 [(1,11),(2,22)] -- Invocation of find
22
Run Code Online (Sandbox Code Playgroud)
这是预期的.然后我尝试从定义中删除k':
Prelude> let find2 k t = head [v | (k,v) <- t]
find2 :: t -> [(t1, a)] -> a
Prelude> find2 2 [(1,11),(2,22)]
11
Run Code Online (Sandbox Code Playgroud)
然后我很惊讶地发现这个价值2
与之相符1
.为了确保我不希望不可能,我也尝试以下内容以确认在Haskell中可以进行部分匹配,看起来实际情况如下:
Prelude> head [v | (2,v) <- [(1,11),(2,22)]]
22 …
Run Code Online (Sandbox Code Playgroud)