최근에 하스켈을 배우기 시작했고 하스켈에서 파이썬으로 인터뷰 한 내용을 다시 작성하려고합니다. 낙타의 문자열을 "("myVariableName "->"my_variable_name ") 분리 된 밑줄로 변환하려고합니다. 또한 첫 번째 문자가 대문자 인 경우 오류가 발생합니다. 나는 그것은 내가 이상한 방법으로 이것에 대해 갈거야, 나는이 구현하는 더 나은 방법에 대한 조언을 싶지만 꽤 가능성이 높습니다 실현초보자 하스켈 문제 (... 발생하지 않는 인스턴스)
import qualified Data.Char as Char
translate_java :: String -> String
translate_java xs = translate_helper $ enumerate xs
where
translate_helper [] = []
translate_helper ((a, num):xs)
| num == 1 and Char.isUpper a = error "cannot start with upper"
| Char.isUpper a = '_' : Char.toLower a : translate_helper xs
| otherwise = a : translate_helper xs
enumerate :: (Num b, Enum b) => [a] -> [(a,b)]
enumerate xs = zip xs [1..]
하지만, 내가 좋아하는 것 : 여기
내가 가진 무엇 이것을 컴파일하기 위해서도.Prelude> :r
[1 of 1] Compiling Main (translate.hs, interpreted)
translate.hs:4:20:
No instance for (Num
(([Bool] -> Bool) -> (Char -> Bool) -> Char -> t))
arising from a use of `translate_helper' at translate.hs:4:20-35
Possible fix:
add an instance declaration for
(Num (([Bool] -> Bool) -> (Char -> Bool) -> Char -> t))
In the first argument of `($)', namely `translate_helper'
In the expression: translate_helper $ enumerate xs
In the definition of `translate_java':
translate_java xs
= translate_helper $ enumerate xs
where
translate_helper [] = []
translate_helper ((a, num) : xs)
| num == 1 and Char.isUpper a
= error "cannot start with upper
"
| Char.isUpper a
= '_' : Char.toLower a : transla
te_helper xs
| otherwise = a : translate_help
er xs
Failed, modules loaded: none.
것은 여기에 무슨 일이 일어나고 있는지의 모든 설명이 좋은 것 : 여기 지금지고있어 오류입니다. 나는 정말로 "(Num (([Bool] -> Bool) -> (Char -> Bool) -> Char -> t))"가 어디에서 오는지 이해하지 못합니다. translate_helper에 대한 타입 선언은 [(a, b)] -> [a]와 같을 것이라고 생각합니다.
빠른 응답을 보내 주셔서 감사합니다. 나는 그 기능을 영원히 바라 보았으며, 나는 그 사실을 결코 파악하지 못했을 것이라고 생각합니다. 다형성이 1 인 것에 대한 좋은 설명. – cgag