Понимание типов и терминов в Haskell

#haskell #syntax

#haskell #синтаксис

Вопрос:

Какие из приведенных ниже типов являются одним и тем же типом:

i. a -> b -> c -> d

ii. (a -> b) -> c -> d

iii. a -> (b -> c) -> d

iv. a -> b -> (c -> d)

v. (a -> b) -> (c -> d)

vi. ((a -> b) -> c) -> d

vii. a -> (b -> (c -> d))

(b) В следующих терминах, каковы типы функций f, учитывая, что x, y, z:: Integer:

i. (f x) (y, z)

ii. f x y z

iii. f (x, y, z)

iv. f (x,(y, z))

(c) Укажите типы следующих терминов (если они действительно вводятся) и укажите, какие из них равны:

i. «abcd»

ii. [(’a’,’b’),(’c’,’d’)]

iii. (’a’:[’b’]):(’c’: [’d’])

iv. ’a’:(’b’:’c’: ’d’:[])

v. [«ab», «cd»]

Я не ищу решения, но мне нужна помощь в понимании использования () и его значения. Спасибо.

Ответ №1:

В типах -> ассоциируется с правом, т.е. a -> b -> c фактически означает a -> (b -> c) . Это функция , которая принимает аргумент типа a и возвращает функцию типа b -> c .

Для сравнения, (a -> b) -> c это функция, которая принимает в качестве аргумента функцию типа a -> b и возвращает значение типа c .

Вот несколько примеров

 foo :: Int -> Bool -> String
-- the same as foo :: Int -> (Bool -> String)
-- takes Int, returns function
foo n = b -> if b amp;amp; n> 5 then "some result" else "some other result"

bar :: (Int -> Bool) -> String
-- takes function, returns string
bar f = if f 43 then "hello" else "good morning"

-- bar can be called in this way
test :: String
test = bar (n -> n > 34)    -- evaluates to "hello"
 

При вызове функции, как в f x y z , приложение связывается слева, как в (((f x) y) z) . Например, они эквивалентны:

 foo 5 True
(foo 5) true
 

Напротив, (,,,,) с запятыми внутри — это способ формирования кортежей, и он не связан с приложением. Следовательно, [(’a’,’b’),(’c’,’d’)] это список пар. Вместо этого в вашем примере (’a’:[’b’]):(’c’:[’d’]) нет запятых, поэтому круглые скобки предназначены только для группировки, а выражение имеет то же значение

 x : y
where x = 'a':['b']
      y = 'c':['d']
 

Попробуйте подумать о том, какие типы должны x и y должны иметь, а затем подумайте о типе x : y , если таковые имеются.