История изменений
Исправление hateyoufeel, (текущая версия) :
То есть то, что на лиспе делается тривиально
(defstruct cons (car cdr))
Тип вроде очевиден:
data Cons a b = Cons a b
Потом берём алгоритм построения списка из этих ячеек. Вводим >специальный элемент end. В лиспе это символ, в Хаскеле
data End = End
Ну, то есть, ты решил сделать через задницу и жалуешься, что получается через задницу?
И тут выясняется, что эту функцию написать невозможно, несмотря на то, что её тип точно определён (Сons a b -> Int).
Потому что для любых a
и b
такая функция и правда невозможна. У тебя огромные проблемы в логике здесь, но ты пытаешься их выдавать за недостатки хачкеля.
data End = End
data Cons a b = Cons a (Either End b)
type List a = Cons a (List a)
len :: List a
len (Cons _ (Left End)) = 1
len (Cons _ (Right l)) = 1 + len l
Кстати, твой список не может быть пустым по определению, но это детали.
Выкидываем всё написанное, начинаем читать про HList.
data List a = Cons a (List a) | Nil
len :: List a -> Word
len Nil = 0
len (Cons _ l) = 1 + len l
Вообще не понимаю твоей проблемы тут.
Исправление hateyoufeel, :
То есть то, что на лиспе делается тривиально
(defstruct cons (car cdr))
Тип вроде очевиден:
data Cons a b = Cons a b
Потом берём алгоритм построения списка из этих ячеек. Вводим >специальный элемент end. В лиспе это символ, в Хаскеле
data End = End
Ну, то есть, ты решил сделать через задницу и жалуешься, что получается через задницу?
И тут выясняется, что эту функцию написать невозможно, несмотря на то, что её тип точно определён (Сons a b -> Int).
Потому что для любых a
и b
такая функция и правда невозможна. У тебя огромные проблемы в логике здесь, но ты пытаешься их выдавать за недостатки хачкеля.
data End = End
data Cons a b = Cons a (Either End b)
type List a = Cons a (List a)
len :: List a
len (Cons _ (Left End)) = 1
len (Cons _ (Right l)) 1 + len l
Кстати, твой список не может быть пустым по определению, но это детали.
Выкидываем всё написанное, начинаем читать про HList.
data List a = Cons a (List a) | Nil
len :: List a -> Word
len Nil = 0
len (Cons _ l) = 1 + len l
Вообще не понимаю твоей проблемы тут.
Исправление hateyoufeel, :
То есть то, что на лиспе делается тривиально
(defstruct cons (car cdr))
Тип вроде очевиден:
data Cons a b = Cons a b
Потом берём алгоритм построения списка из этих ячеек. Вводим >специальный элемент end. В лиспе это символ, в Хаскеле
data End = End
Ну, то есть, ты решил сделать через задницу и жалуешься, что получается через задницу?
И тут выясняется, что эту функцию написать невозможно, несмотря на то, что её тип точно определён (Сons a b -> Int).
Потому что для любых a
и b
такая функция и правда невозможна. У тебя огромные проблемы в логике здесь, но ты пытаешься их выдавать за недостатки хачкеля.
data End = End
deriving Eq
data Cons a b = Cons a (Either End b)
type List a = Cons a (List a)
len :: List a
len (Cons _ (Left End)) = 1
len (Cons _ (Right l)) 1 + len l
Кстати, твой список не может быть пустым по определению, но это детали.
Выкидываем всё написанное, начинаем читать про HList.
data List a = Cons a (List a) | Nil
len :: List a -> Word
len Nil = 0
len (Cons _ l) = 1 + len l
Вообще не понимаю твоей проблемы тут.
Исходная версия hateyoufeel, :
То есть то, что на лиспе делается тривиально
(defstruct cons (car cdr))
Тип вроде очевиден:
data Cons a b = Cons a b
Потом берём алгоритм построения списка из этих ячеек. Вводим >специальный элемент end. В лиспе это символ, в Хаскеле
data End = End
Ну, то есть, ты решил сделать через задницу и жалуешься, что получается через задницу?
И тут выясняется, что эту функцию написать невозможно, несмотря на то, что её тип точно определён (Сons a b -> Int).
Потому что для любых a
и b
такая функция и правда невозможна. У тебя огромные проблемы в логике здесь, но ты пытаешься их выдавать за недостатки хачкеля.
Выкидываем всё написанное, начинаем читать про HList.
data List a = Cons a (List a) | Nil
len :: List a -> Word
len Nil = 0
len (Cons _ l) = 1 + len l
Вообще не понимаю твоей проблемы тут.