Ошибка с функциями внутри кортежей в Haskell - PullRequest
3 голосов
/ 17 февраля 2011

Я немного играю с Haskell и застрял с этой ошибкой, используя функцию snd с кортежем (String, list).

snd ("Felix Felices",[("Escarabajos Machacados",52,[f1,f2]),("Ojo de Tigre Sucio",2,[f2])])
ERROR - Cannot find "show" function for:
*** Expression : snd ("Felix Felices",[("Escarabajos Machacados",52,[f1,f2]),("Ojo de Tigre Sucio",2,[f2])])
*** Of type    : [([Char],Integer,[(Integer,Integer,Integer) -> (Integer,Integer,Integer)])]

Дело в том, что если я удаляю f1, f2 и f3 (они являются функциями), код работает нормально, он возвращает список. Почему это происходит, почему я не могу просто поместить функцию во вторую позицию кортежа?

Ответы [ 4 ]

5 голосов
/ 17 февраля 2011

Вы можете помещать функции в кортежи.Но вы не можете отобразить их - ghci хочет show результат и распечатать его.Как это должно show (преобразовать в строку) функции?Это не может быть, или, по крайней мере, никому не хотелось выбирать один из способов сделать это (который в любом случае был бы ошибочным - по крайней мере, я не могу придумать ни одного подхода, в котором нет дыр в огромных пространствах, даже я их вижу).Следовательно, вы не можете оценить то, что возвращает функции или наборы функций в ghci.

4 голосов
/ 17 февраля 2011

Проблема на самом деле не в функциях f1, f2 или f3, проблема в том, что вы пытаетесь распечатать эти функции, но у функций нет экземпляра Show, поэтому они не могут быть напечатаны.Однако, если вы попытаетесь:

Prelude> snd ("Felix Felices",[("Escarabajos Machacados",52,["f1","f2"]),("Ojo de Tigre     Sucio",2,["f2"])])

, вы получите результат:

[("Escarabajos Machacados",52,["f1","f2"]),("Ojo de Tigre Sucio",2,["f2"])]

Так что проблема не в том, что вы не можете иметь функцию в кортеже, проблема в том, что вы не можетепреобразовывать функции в строки, чтобы их можно было печатать.

3 голосов
/ 18 февраля 2011

module Text.Show.Functions обеспечивает instance Show (a -> b).

ghci> :m +Text.Show.Functions
ghci> [(*), (/)]
[<function>,<function>]

Бесполезно на самом деле выяснять, что это за функции, но в любом случае нет хорошего способа сделать это (ну, кроме отладчика и вакуум ). Но если вам просто нужно несколько Show экземпляров для удобства, это равно в стандартной библиотеке.

0 голосов
/ 17 февраля 2011

Вы не можете печатать голые функции в Haskell, так как для них не определена функция "show". Вы получаете тот же тип ошибки, если вы наберете

Объятия> sqrt

например

Система сообщает тип выражения, который в вашем случае ([Char], Integer, [(Integer, Integer, Integer) -> (Integer, Integer, Integer)])], но не может напечатать его, потому что это функция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...