2012-09-29 35 views
12

Estoy tomando una programación funcional Coursera en la clase Scala. Esta es la segunda semana y choco contra una pared. En la tarea estamos trabajando con Sets, pero no con el tipo de Set que todos conocemos en Java, por ejemplo. Es un conjunto que devuelve verdadero si el valor está allí y de lo contrario es falso. Dicen que no es un contenedor, es solo una función.Ayuda de asignación: unión entre conjuntos

Para que quede claro, necesito su ayuda. No quiero que resuelvas mi tarea, es solo un ejemplo de que quiero tener la idea de lo que debo hacer.

/** 
    * We represent a set by its characteristic function, i.e. 
    * its `contains` predicate. 
    */ 
    type Set = Int => Boolean 

/** 
    * Indicates whether a set contains a given element. 
    */ 
    def contains(s: Set, elem: Int): Boolean = s(elem) 

/** 
    * Returns the set of the one given element. 
    */ 
    def singletonSet(elem: Int): Set = Set(elem) 

/** 
    * Returns the union of the two given sets, 
    * the sets of all elements that are in either `s` or `t`. 
    */ 
    def union(s: Set, t: Set): Set = ??? 

Este es el código. En el singletonSet supongo que la forma de resolverlo es devolver el Set(elem), ¿verdad?

Si eso es bueno, ¿cómo se supone que debo hacer la unión entre los dos? No soy nuevo en programación pero no veo ninguna manera de hacerlo. Como no debería devolver un "conjunto" de números.

Esto es lo que otro alumno me contó sobre los conjuntos: "Pero todo un" Conjunto "es una función que toma un Int y devuelve un Booleano (Int => Booleano). Cualquier función que toma un Int y devuelve un boolean ajusta el tipo 'Set' "

lo que intenté en la función de unión es tener algo como:.

def union(s: Set, t: Set): Set = (s | t) //value | not a member of Int => Boolean 

Cualquier ayuda se agradece :)

+0

Curioso que http://stackoverflow.com/questions/13052735/is-my-understanding-of-below-scala-code-correct es esencialmente la misma pregunta y permanece abierta. La OMI debe estar abierta ya que son preguntas válidas. – talonx

Respuesta

35

Parece que la pared que está golpeando es que no está familiarizado con la definición de funciones en Scala. En este caso particular, necesita definir funciones del tipo Int => Boolean, toman un Int y devuelven un Boolean.

Aquí hay algunos ejemplos de los literales de funciones del tipo Int => Boolean. Trate de ellos en la consola Scala o la hoja de cálculo Scala IDE:

(x: Int) => true 
(x: Int) => false 
(x: Int) => x == 2 
(x: Int) => x == 10 
(x: Int) => x == 2 || x == 10 
(x: Int) => x % 2 == 0 

Entonces todo lo que tiene que hacer para la asignación es utilizar la misma sintaxis, a partir de (x: Int) => y luego traducir el significado de la unión, se cruzan, .. en el lado derecho de la expresión.

Parte del aprendizaje es hacer un esfuerzo genuino. Creo que puede volver a enviar la solución varias veces, por lo que no dude en enviarla y repetirla si no obtiene 10/10 en el primer intento. Todo lo que necesitas es compilar el código. ¡Buena suerte!

+1

esto ayudó. Gracias. Hubiera sido más fácil si tuviera una respuesta como esta antes. Descubrí por mi cuenta cómo hacerlo después de muchas horas de intentos y algunas otras respuestas (que realmente no revelaron la respuesta) :) – Andrew

+2

Eso no quiere decir que no aprecie su respuesta. Por el contrario, muchas gracias – Andrew

+0

Perdón por comentar sobre un hilo inactivo. Pero, ¿hay algún artículo o video donde pueda entender mejor este problema? Todo lo que veo es la lógica de las abstracciones, pero no estoy muy familiarizado con Scala y me gustaría entender el problema antes de tratar de resolverlo. – kromastorm

8

Una posible pista es mira los tipos. Mira el tipo Set. En realidad, es un alias de tipo para una función de Int en Boolean.

Por lo tanto, cuando tiene dos juegos, en realidad tiene dos funciones. ¿Cómo puede usarlos para proporcionar una función que represente la unión de estos Conjuntos? Debe ser tu punto de partida.

+0

Haría un quirófano entre las dos funciones, pero también necesitaría una X. No puedo obtener una mejor respuesta. – Andrew

+1

Olvidaste el hecho más importante: 'Set' es un alias para una función. Su 'X' proviene de ella: debe devolver una función, que explica qué hacer con una' X' externa. – Nicolas

+0

por lo que es un quirófano entre los 2 conjuntos?Intenté esto y no funciona tener "s | t", dice "value | no es miembro de Int => Boolean". – Andrew

Cuestiones relacionadas