小编诺 铁*_*诺 铁的帖子

混淆功能作为haskell中Functor的实例

Functor中的fmap类型是:

fmap :: Functor f => (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)

看起来,首先将函数(a - > b)应用于fa的参数以创建类型b的结果,然后对其应用f,结果为fb

使用Maybe a例如:

 fmap show (Just 1)
 result is : Just "1"
Run Code Online (Sandbox Code Playgroud)

同说:

Just (show 1)
Run Code Online (Sandbox Code Playgroud)

但是当( - >)用作Functor时(在Control.Monad.Instances中)

import Control.Monad.Instances
(fmap show Just) 1
result is : "Just 1"
Run Code Online (Sandbox Code Playgroud)

也就是说,Just首先应用,然后显示应用.在另一个例子中,结果是相同的:

 fmap (*3) (+100) 1
 result is 303
Run Code Online (Sandbox Code Playgroud)

为什么不*3先,然后+100?

haskell functor

23
推荐指数
4
解决办法
5873
查看次数

登录scala时如何保持返回值

在java中编程时,我总是记录输入参数和方法的返回值,但在scala中,方法的最后一行是返回值.所以我必须这样做:

def myFunc() = {
  val rs = calcSomeResult()
  logger.info("result is:" + rs)
  rs
}
Run Code Online (Sandbox Code Playgroud)

为了方便起见,我写了一个实用工具:

class LogUtil(val f: (String) => Unit) {
 def logWithValue[T](msg: String, value: T): T = { f(msg); value }
}

object LogUtil {
  def withValue[T](f: String => Unit): ((String, T) => T) = new LogUtil(f).logWithValue _
}
Run Code Online (Sandbox Code Playgroud)

然后我用它作为:

val rs = calcSomeResult()
withValue(logger.info)("result is:" + rs, rs) 
Run Code Online (Sandbox Code Playgroud)

它会记录该值并将其返回.它对我有用,但似乎很奇怪.因为我是一个古老的java程序员,但对scala不熟悉,我不知道在scala中是否有更惯用的方法.


感谢您的帮助,现在我使用romusz提到的Kestrel组合器创建了一个更好的工具

object LogUtil {
  def kestrel[A](x: A)(f: A => Unit): A = { f(x); x }
  def …
Run Code Online (Sandbox Code Playgroud)

logging scala

20
推荐指数
4
解决办法
2933
查看次数

标签 统计

functor ×1

haskell ×1

logging ×1

scala ×1