Почему этот код не работает? (объединение двух тестовых функций)

#haskell

#haskell

Вопрос:

 module Data where

data Cons a = Con (a -> Bool)
   deriving (Show)           

twoCons :: Cons a -> Cons a -> Cons a
twoCons (Con a) (Con b) = Con (twoCons' a b)

twoCons' :: (a -> Bool) -> (a -> Bool) -> (a -> Bool)
twoCons' c1 c2 x = (c1 x) amp;amp; (c2 x)
  

Этот код не работает, с или без deriving (Show) .

Предполагается, что он объединяет два теста / ограничения и возвращает функцию, обернутую третьим Con . Ограничения могут быть (>1) и (<10) , результатом должна быть комбинация двух ограничений, тип ограничения может быть любым.

Комментарии:

1. Что вы подразумеваете под «это не работает»? Если он не компилируется, сообщите нам сообщение об ошибке. Если он компилируется, но выдает неверный результат, сообщите нам, какие значения дают вам неверный результат, сообщите нам этот неверный результат и сообщите нам, чего вы ожидали вместо этого.

2. nvm Я думаю, что у меня получилось…

Ответ №1:

Проблема в том, что нет разумного способа написать экземпляр Show for Cons (попробуйте сами!)

Если вы удалите deriving (Show) предложение, ваш код будет работать отлично.

Комментарии:

1. Кроме того, тело конструктора Cons является функциональным типом (a -> Bool) . Вы можете выводить Show только для типов первого порядка, таких как Int, Bool, String, list, pair и их комбинаций.