Haskell - uczę się języka

0

Mam takie zadania:

  1. Podaj definicję rekurencyjną funkcji zamiana, która zamienia listę wartości 0, 1 na listę
    wartości logicznych True, False, np. [1,0,1,1] -> [True,False,True,True]

  2. Zdefiniuj funkcję dwuargumentową rownowaznosc oznaczającą równoważność logiczną:
    z wykorzystaniem operatorów &&, || i funkcji not.

Najlepiej prosiłbym o rozwiązanie i wytłumaczenie
Dzięki!

4

Czego w tym zadaniu nie wiesz lub nie rozumiesz? Z jakich zrodel sie uczysz? Co juz napisales?

2

prosiłbym o rozwiązanie

Do zleceń polegających na "proszę to zrobić za mnie" jest osobny dział - https://4programmers.net/Forum/Og%C5%82oszenia_drobne. Tutaj możesz uzyskać pomoc, ale rozumianą jako pokierowanie albo wskazanie, gdzie popełniasz błąd. Raczej nikt nie będzie chciał tego zrobić od A do Z za Ciebie :P

0

zad 2

zamiana::Bool->Bool
zamiana p q = if p==False && q==False then True
      else if p==True && q==True then True
      else p || q == False && p || q == not(False) -- ta linijka jest raczej źle
1

Co do 2. zdefiniuj to w dowolnym innym języku, w Haskellu będzie identycznie. Podpowiedź, w notacji polskiej będzie to (używając tylko operatorów i oraz lub) AKpqKNpNq (alternatywa koniunkcji p i q oraz koniunkcji negacji p i negacji q).

Co jest trudnego w 1.? Bo to jest dosłownie pierwsza rzecz jaką się w Haskellu pisze, więc pokaż co masz i wtedy się zastanowimy. W przeciwnym wypadku Kosz.

1

Jesteś pewny, że chcesz się nauczyć Haskella? Nawet nie kojarzysz, że pierwszy przykład to szkolne zastosowanie funkcji map? Podstawy programowania funkcyjnego przecież. Może zacząłbyś od scali? Łatwiej będzie się przestawić. Niestety Haskella nie znam, w CL(żeby nie było za łatwo xD) używa się jej jakoś tak:

(mapcar (lambda (i) (= i 1)) '(0 0 1 1 0 1 0 1))

W tym drugim !p && !q || p && q ? Przecież składni cię nie będziemy chba uczyć? Bez przesady :)

0
fun bin_to_logical(xs):
	if empty(xs):
		return ()
	if head(xs) == 1: 
		return cons(True, bin_to_logical(rest(xs)))
	else:
		return cons(False, bin_to_logical(rest(xs)))

Nie znam dobrze Haskella, nie chcę konfabulować, wrzucam pseudokod. To znowu jeden z podstawowych patternów rekurencyjnych w programowaniu funkcyjnym (oczywiście można to uogólnić, jak wyżej, do map, lub, jak język wspiera, a Haskell tak, zoptymalizować do TCO). Idzie tak: Jeśli lista wejściowa pusta zwróć coś - warunek zatrzymania rekurencji - to może być zero, pusta lista, zależy; jeśli nie procesuj w jakiś sposób głowę listy i wykonaj cons, czyli dodaj tak przerobioną głowę do rekurencyjnego wywołania funkcji od reszty listy (rest zwraca listę bez pierwszego elementu).

1

@lion137: z racji, że Haskell ma pattern matching, to nie stosuje się ifów, a będzie to wyglądało raczej tak (przykład w Elixirze):

def bin_to_logical([]), do: []
def bin_to_logical([0 | rest]), do: [false | bin_to_logical(rest)]
def bin_to_logical([1 | rest]), do: [true | bin_to_logical(rest)]

Lub jeśli chcemy "ręcznie" obsłużyć TCO (nie wiem czy kompilator dojdzie do tego sam w tym przypadku):

def bin_to_logical(list), do: transform(list, [])

# Prywatne funkcje ukrywające implementacje
defp transform([], acc), do: Enum.reverse(acc)
defp transform([0 | rest], acc), do: transform(rest, [false | acc])
defp transform([1 | rest], acc), do: transform(rest, [true | acc])

1 użytkowników online, w tym zalogowanych: 0, gości: 1