我需要一个函数,它接受任意数量的参数(所有相同的类型),对它们做一些事情然后给出一个结果.在我的具体情况下,参数列表是不切实际的.
当我查看haskell库时,我看到函数printf(来自模块Text.Printf)使用了类似的技巧.不幸的是,通过查看来源我无法理解这种魔力.
有人可以解释如何实现这一点,或至少一些网页/纸/任何我可以找到一个良好的描述吗?
动机:
我需要它的原因非常简单.对于学校(计算机科学课),我们需要编写一个能够"记录"数学表达式,将其表示为字符串的模块(通过为自己的数据类型编写Num/Real/etc的实例),并执行对它的各种操作.
此数据类型包含变量的特殊构造函数,可以由值或指定函数的任何值替换.其中一个目标是编写一个函数,它使用一些变量(类型对(Char,Rational))来表达这种表达式并计算表达式的结果.我们应该看看如何最好地表达函数的目标.(我的想法:该函数返回另一个函数,它接受与函数中定义的变量一样多的参数 - 似乎是不可能的).
我正在努力弄清楚如何将State的函数表示与Scala的Random类合并以生成随机整数.我正在学习Scala中的函数编程一书,因此大部分代码都是从那里获取的.
以下是State类的外观,直接来自本书:
case class State[S, +A](run: S => (A, S))
Run Code Online (Sandbox Code Playgroud)
这就是我想要做的事情:
object State {
type Rand[A] = State[A, Random] // the Random from scala.util.Random
def nextIntInRange(from: Int, to: Int): Rand[Int] =
??? _.nextInt(from - to) + from ??? // unsure about much of this
def get(a: Rand[A]): A = ??? // also unsure; should modify state
def getAndPreserveState(a: Rand[A]): A = ??? // ditto; should not modify state
def diceRolls(n: Int) = {
val roll = nextIntInRange(1, 6) …Run Code Online (Sandbox Code Playgroud) 假设我有
class Foo a where
(++=) :: a -> a -> a
cool :: (a -> b -> b) -> a -> b
Run Code Online (Sandbox Code Playgroud)
并想做
class Bar a where
(++=) :: (a -> b) -> a -> b
magic :: a -> b
Run Code Online (Sandbox Code Playgroud)
它有一个重叠的方法名称,(++=).有什么方法可以做到这一点吗?
我已经看到许多网站(例如Facebook或堆栈溢出)将在生成新数据时更新某些功能(例如,帖子上的新答案).
可以说,博客中添加了一个新帖子,当时有人在博客中查看它,想法是自动将新帖子添加到博客而不刷新或让用户执行任何操作.
我曾想过每5秒左右执行一次AJAX调用,但这会对服务器发出太多请求,而且我看到我提到的网站(更新内容)没有提出任何新请求.
我真的不知道如何实现这一目标.PHP和AJAX可以实现吗?我也听说过websockets.有任何想法吗?谢谢
Array为了从我尝试过的每一列中找到不同的值
RDD[Array[String]].map(_.map(Set(_))).reduce {
(a, b) => (a.zip(b)).map { case (x, y) => x ++ y}}
Run Code Online (Sandbox Code Playgroud)
执行成功。但是,我想知道是否有比上面的示例代码更有效的方法。谢谢。
我知道这似乎与找不到模块 `Yesod'重复,但与该用户不同,ghc-pkg list它没有显示Yesod在我计算机上的输出中,他们似乎没有使用stack(我是,我不确定是否意味着我不需要担心ghc-pkg list),此外,该问题的答案(代码)对我的情况没有帮助。
该耶索德书有一个例子,我一直试图去工作了好几个小时了。我会在这里重印
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
import Yesod
data HelloWorld = HelloWorld
mkYesod "HelloWorld" [parseRoutes|
/ HomeR GET
|]
instance Yesod HelloWorld
getHomeR :: Handler Html
getHomeR = defaultLayout [whamlet|Hello World!|]
main :: IO ()
main = warp 3000 HelloWorld
Run Code Online (Sandbox Code Playgroud)
我使用的是最新的 64 位 Ubuntu 操作系统。我一直遇到的问题是它runhaskell hello-world.hs会一次又一次地回来
hello-world.hs:6:18:
Could not …Run Code Online (Sandbox Code Playgroud) 尽管多次阅读Scala样式指南 - 方法调用,但我已经对此感到困惑了一段时间.
我希望能够调用此方法
def foldRVL[A,B](l: List[A], z: B)(f: (A, B) => B) = //"Right-Via-Left"
l.reverse.foldLeft(z)((a, b) => f(b, a))
Run Code Online (Sandbox Code Playgroud)
使用这样的点符号List(1,2,3).foldRVL(0)(_ + _).
而不是这样的:foldRVL(List(1,2,3), 0)(_ + _).
此外,有时我看到的代码显示的方法实际上是在签名中采用零参数,或者比我预期的要少一个参数,并且仍然使用点符号正确地获取参数.这是如何运作的?我问这个,因为这些方法使用点符号,所以也许如果我写了类似的东西,我可以解决我的问题.
虽然disjoint在保护条件下耗尽了所有可能的模式,但Haskell PatternMatchFail在运行时会给我一个错误.
disjoint :: (Ord a) => [a] -> [a] -> Bool
disjoint l@(x:xs) r@(y:ys)
| null l || null r = True
| x == y = False
| x > y = disjoint l ys -- reduce right list
| otherwise = disjoint xs r -- reduce left list
-- | Terminates when either list has been reduced to null, or when their head
-- elements are equal. Since lists are ordered, it only needs …Run Code Online (Sandbox Code Playgroud) haskell ×5
scala ×3
ajax ×1
apache-spark ×1
asynchronous ×1
html ×1
html5 ×1
performance ×1
polyvariadic ×1
random ×1
state ×1
this ×1
typeclass ×1
websocket ×1
yesod ×1