当前位置: 首页 > 知识库问答 >
问题:

如果函数可以是不同类型的,那么一元规则将如何应用

周朗
2023-03-14

我正在研究clojure和Scala之间的互操作。由于java本身现在有lambda,所以我想在数据和如何将函数应用到集合之间进行一个概括

  • Clojure函数扩展了Clojure.lang.IFN并概括了Clojure.lang.ISEQ
  • 上的集合操作
  • Scala函数扩展了Scala.Function并概括了Scala.collection.Traversable
  • 上的集合操作
  • Java lambda扩展java.util.function.function并概括了java.util.stream.stream
  • 上的集合操作

问题:

    null
  (map (scala-fn +) 
       [1 2 3]
       (scala-seq [1 2 3]) 
       (.stream [1 2 3]))
  => (scala-seq [3 6 9])

Clojure、Scala和Java中都有这样的操作:获取集合、将函数应用到该集合并返回新的集合。

  • 所有这些语言都运行在JVM上。
  • 但是,每种语言都定义自己的类来表示函数。

我更熟悉clojure,所以有类似的操作:

 (into {} [[:a 1] [:b 2]]) => {:a 1 :b 2}

该功能看起来如下所示:

 (into {} (scala-list [:a 1] [:b 2])) => {:a 1 :b 2}

 (into (scala-map) [[:a 1] [:b 2]]) => (scala-map :a 1 :b 2)

 (concat (scala-list 1 2) [3 4]) => (scala-list 1 2 3 4)

 (concat [1 2] (scala-list 3 4)) => (1 2 3 4) ;lazy seq

 (map + [1 2] (scala-list 3 4)) => [4 6]

 (map (scala-fn +) [1 2] (scala-list 3 4)) => [4 6]
  • 我需要的是在收集操作中同时使用clojure和scala函数的能力。
  • 我可以在不使用单子的情况下做到这一点(通过检查集合和函数类型,并在函数应用之前进行一些强制操作)
  • 我在这里问的问题对我来说有点好奇心,因为我读过的关于单子的所有文献似乎都假定任何函数f:x->y都是通用的。
  • 但是,在clojure/scala/lambda互操作的情况下,clojure、scala函数和java lambda不是通用的。我很好奇范畴理论是如何用来解决这个问题的。

共有1个答案

严易安
2023-03-14

我只能给你哈斯克尔的答案,因为我不会说任何其他语言。然而,在我看来,您似乎主要是在寻找一种将输入自动转换为函数的方法。这似乎与单子无关。

(concat (scala-list 1 2) [3 4]) => (scala-list 1 2 3 4)

如果我把它翻译成Haskell,我会给它一个像这样的类型

concat :: (IsList l1, IsList l2) => l1 elem -> l2 elem -> [elem]

其中,ToList是一个类型类,它将把这个容器转换成一个列表

class IsListOf a where
    toList :: a elem -> [elem]
(map + [1 2] (scala-list 3 4)) => [4 6]
zipWith :: (IsList l1, IsList l2) => (a -> b -> c) -> l1 a -> l2 b -> [c]
zipWith :: (IsList l1, IsList l2, Is2Function f) => f a b c -> l1 a -> l2 b -> [c]
class Is2Function f where
    toFunction :: f a b c -> a -> b -> c
 类似资料:
  • 本文向大家介绍topic的分区数可不可以增加?如果可以怎么增加?如果不可以,那又是为什么?相关面试题,主要包含被问及topic的分区数可不可以增加?如果可以怎么增加?如果不可以,那又是为什么?时的应答技巧和注意事项,需要的朋友参考一下 可以增加 bin/kafka-topics.sh --zookeeper localhost:2181/kafka --alter --topic topic-co

  • 本文向大家介绍topic的分区数可不可以减少?如果可以怎么减少?如果不可以,那又是为什么?相关面试题,主要包含被问及topic的分区数可不可以减少?如果可以怎么减少?如果不可以,那又是为什么?时的应答技巧和注意事项,需要的朋友参考一下 不可以减少,被删除的分区数据难以处理。

  • 做对了"。事实证明,可以用来表示任何类似ListT-dod-right的东西。引用加布里埃尔·冈萨雷斯的话: 请注意,您可以仅使用变压器依赖项构建任何(不仅仅是管道中的那个)。例如,下面是如何实现: 这将在那里键入check作为any,并为所有人做正确的事情。 所以我的问题是:对于管道的消费者部分,是否有一个对偶到和到? 要求: 从不使用,只返回(或从不返回),但使用的管道可以表示为“双重到列表”

  • 我有这样一段数据: 我想编写一个函数,该函数最终的返回结果为: ((职位 = 1 or 职位 = 2 or 职位 = 3) or (职级 != a or 职级 != b)) and (职位 = cc) 目前我用递归没写出来

  • 我是新来的Spring Web通量/Reactor核心,并试图执行以下功能: > 如果返回用户,则返回“用户”类型的响应实体。如果为空,则返回“字符串”类型的响应实体 以下代码给出了一个类型错误,因为. defaultIf空()期望类型为user的响应实体。您能建议正确的运算符/方法来实现此功能吗?

  • 我使用下面的代码来查找反射中的类成员是原语和某个对象,我的问题是有一种方法来识别字段是否是类型原语、对象、类引用,因为我想根据类型调用特定的方法。例如,如果field是原语,则调用HandleErimition,如果field是其他类型引用(在下面的示例中是SalesOrderItemPK,PrimaryKey;),则调用方法handleClassReferance等 只是为了理解,我需要获得类,