Definicje typów w haskellu

0

O ile zrozumiałem stworzenie np. takich typów:

data Color = Red|Green|Yellow 

lub

type Para a = (a,a)
type Boole = Para Bool

to zupełnie nie mam pojęcia o co chodzi w czymś takim:

data MyType = MyType (Int -> Bool)

lub

newtype Radius = Radius Double
data Diameter = Diameter Double

Jest ktoś w stanie mi wyjaśnić dlaczego po słowie kluczowym data pojawia się nazwa typu, a następnie po znaku równości znowu pojawia się ta sama nazwa? Nie wspominając już o tym Int -> Double, tego w ogóle nie rozumiem.

dodałem <code> - msm

0

Ok, piszesz że rozumiesz:

data Color = Red|Green|Yellow

No to wiesz wszystko...

data Color = Red|Green|Yellow|Rgb Int Int Int

To samo, tylko że doszło rgb. Albo co innego, odmiana Maybe:

data MaybeInt = NoInt | JustInt Int

Mamy NoInt oraz JustInt przyjmujące Inta.

Ok, modules loaded: Main.
*Main> :t NoInt
NoInt :: MaybeInt
*Main> :t JustInt 3
JustInt 3 :: MaybeInt
*Main> :t JustInt  -- level hard
JustInt :: Int -> MaybeInt
*Main> :t JustInt

Czyli co jest dziwnego w, na przykład:

data Diameter = Diameter Double
data MyType = MyType (Int -> Bool)

(po prostu konstruktor nazywa się tak samo jak typ)

Ogólnie, radziłbym zająć się jakimś kursem 'od podstaw' Haskella, gdyż błądzisz - polecam http://learnyouahaskell.com/ na początek, a jeśli chcesz/będziesz chciał się rozwijać dalej, Real World Haskell.

0

@msm zapomniał wspomnieć co znaczy Int -> Bool. To jest typ funkcji (dokładniej to Int też jest typem funkcji, ale tego się dowiesz jak przerobisz tutki podane wyżej). Jest to funkcja przyjmująca 1 argument typu Int i zwracająca typ Bool.

0

Doczytałem nieco w linku podanym przez MSM i nieco mi się rozjaśniło.

Rozumiem już, że np.

Point 2 3

jest typu Point

 gdzie <code class="haskell">data Point = Point Int Int 

.

Nadal mam jednak problem ze zrozumieniem (a może raczej zastosowaniem) typu danych który w konstruktorze przyjmuje funkcję, np.

data FSet a = FSet (a -> Bool)

Stworzyłem funkcję

f :: Int -> Bool
f x 
 | x == 0 = True
 | x == 1 = False

rozumiem zatem, że wyrażenie

FSet f 

jest typu FSet Int

. 

Nie mam jednak pomysłu w jaki sposób mógłbym stworzyć funkcję, której argumentami lub wynikami było by coś typu 
```haskell
FSet a

(gdzie a jak dobrze rozumiem, jest dowolnym typem).

Byłbym wdzięczny za pomoc.

0

Tak samo jak używasz funkcji przyjmujących monady:

g :: a -> FSet a -> Bool
g a (FSet f) = f a

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