相关疑难解决方法(0)

为什么Haskell(有时)被称为"最佳命令语言"?

(我希望这个问题是关于主题的 - 我试图寻找答案,但没有找到明确的答案.如果这恰好是偏离主题或已经回答,请缓和/删除它.)

我记得听过/读过关于Haskell 几次是最好的命令式语言的半开玩笑的评论,这当然听起来很奇怪,因为Haskell通常以其功能特性而闻名.

所以我的问题是,Haskell的哪些特性/特性(如果有的话)有理由证明Haskell被认为是最好的命令式语言 - 或者它实际上更像是一个笑话?

haskell imperative-programming

81
推荐指数
3
解决办法
2万
查看次数

有可能让` - =`与文字一起工作吗?

今天我在Quora上发现了这篇帖子,声称这一点

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)

可能是正确的Haskell代码.我好奇,最后得到

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

13
推荐指数
1
解决办法
420
查看次数

Haskell元组与函数参数不匹配

我是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)

haskell pattern-matching ghci winghci

2
推荐指数
1
解决办法
172
查看次数