Какое ключевое слово типа в Haskell - PullRequest
3 голосов
/ 02 мая 2020

Наткнулся на ключевое слово типа в Haskell:

type Item = String

, но не уверен, что он делает, как его использовать или чем он отличается от data. Поиск Google в Интернете не помог.

Я пытался реализовать его в коде, подобном следующему:

    import System.IO

main = do  
        putStrLn "Hello, what's your name?"  
        type Item = String
        let test :: Item
        test = "chris"
        putStrLn test  

, но я получил ошибку

Ошибка разбора при вводе 'type'

Пожалуйста, с точки зрения непрофессионала, что такое type и как его можно использовать и чем оно отличается от данных?

Ответы [ 2 ]

4 голосов
/ 02 мая 2020

Это псевдоним типа . Это означает, что вы можете использовать Item в своем коде, где вы можете использовать String.

Псевдоним типа часто используется, когда вы, например, хотите дать имя более сложным типам. Например:

import Data.Map(Map)

type Dictionary = Map String String

здесь, таким образом, вы можете использовать Dictionary вместо того, чтобы каждый раз писать Map String String.

Кроме того, оно часто используется, если вы хотите указать, что вы работаете с Item s, псевдоним затем используется в сигнатуре типа и в документации, что часто лучше, чем запись String.

Он также используется, если вы еще не знаете, какой тип вы будете использовать для конкретного c объекта. Используя псевдоним типа, вы можете работать с Item, а позже, если вы измените свой made, определите тип для Item или сделаете его псевдонимом другого типа. Это делает более удобным изменение типов.

Я пытался реализовать его в коде, подобном следующему:
import System.IO

main = do  
    putStrLn "Hello, what's your name?"  
    type Item = String
    let test :: Item
    test = "chris"
    putStrLn test

Псевдоним типа определен на верхнем уровне, поэтому не в do блок, который определит определение типа локально. Хотя, как @ moon Goose говорит , есть некоторые предложения сделать определения типов более локальными, но в настоящее время это не так.

Вы можете определить псевдоним типа, например:

import System.IO

<b>type Item = String</b>

main = do  
    putStrLn "Hello, what's your name?"  
    let test :: Item
        test = "chris"
    putStrLn test
2 голосов
/ 02 мая 2020
type A = B

означает в точности то же самое, что и

typedef B A

в C или C ++, и ведет себя в основном так же, как просто

a = b

, за исключением того, что A и B - это объекты уровня типа, а не объекты уровня значения. Например,

Prelude> type A = Int
Prelude> :i A
type A = Int    -- Defined at <interactive>:1:1

Prelude> a = 37
Prelude> a
37

Поскольку теперь A = Int, я могу использовать идентификатор типа A точно везде, где я мог бы также использовать Int напрямую:

Prelude> 37 :: Int
37
Prelude> 37 :: A
37

и даже

Prelude> (37 :: Int) :: A
37

Обратите внимание, что здесь происходит преобразование типа no , как, например, в других языках. Int и A - это просто разные имена для одного и того же типа , поэтому аннотирование с обоими - это просто тавтология.

Сравните это с data (или newtype), которые определяют новый, отдельный тип, который просто содержит data указанного типа.

Prelude> data A' = A' { getA :: Int }
Prelude> (37 :: Int) :: A'

<interactive>:12:2: error:
    • Couldn't match expected type ‘A'’ with actual type ‘Int’
    • In the expression: (37 :: Int) :: A'
      In an equation for ‘it’: it = (37 :: Int) :: A'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...