我是Haskell的新手,我已经四处寻找下面的答案,但没有运气.
为什么这段代码不能编译?
newtype Name = Name String deriving (Show, Read)
newtype Age = Age Int deriving (Show, Read)
newtype Height = Height Int deriving (Show, Read)
data User = Person Name Age Height deriving (Show, Read)
data Characteristics a b c = Characteristics a b c
exampleFunction :: Characteristics a b c -> User
exampleFunction (Characteristics a b c) = (Person (Name a) (Age b) (Height c))
Run Code Online (Sandbox Code Playgroud)
错误:
"Couldn't match expected type ‘String’ with actual type ‘a’,‘a’ is a rigid …Run Code Online (Sandbox Code Playgroud) 我不理解冒号在以下lambda表达式中的作用:
myFunction :: [Int] -> [Int]
myFunction li = foldr (\x acc -> if x < 10 then x : acc else acc) [last li] li
Run Code Online (Sandbox Code Playgroud)
我习惯于看到冒号进行递归操作,但看起来这个冒号实际上是在说当前累加器列表的前置,是吗?
我有以下数据类型:
data Users = Height Int | Age Int
Run Code Online (Sandbox Code Playgroud)
然后我有一个年龄列表:
myList = [Age 44, Age 54, Age 21, Age 34, Age 22]
Run Code Online (Sandbox Code Playgroud)
我想申请这个功能:
myFunction :: [Users] -> [Users]
myFunction li = [x + 1 | x <- li]
Run Code Online (Sandbox Code Playgroud)
但是,这会导致以下错误:
"No instance for (Num Users) arising from a use of ‘+’"
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?我是否需要将'Age'与每个值分开?
这是一个简单的问题,但我仍然不确定.在Haskell中使用自定义类型的主要好处是什么,例如:
data Users a = User a a a
data Towns a = TownA Int | TownB String | Nill
Run Code Online (Sandbox Code Playgroud)
这些自定义类型的主要用途是作为命令式语言中的对象吗?如
template<typename U>
class User
{
U a1;
U a2;
U a3;
};
int main()
{
User<std::string> UserObj; UserObj.a1="a1"; //etc
}
Run Code Online (Sandbox Code Playgroud)
有没有人有简短而一般的解释?
NB我理解二进制类型的有用性,比如Maybe,我的问题更多的是关于自定义类型的使用.
我试图更多地了解运算符重载的实际用法,以便我可以在我的代码中有效地使用它们.
你能描述一下重载通常有用的一般场景吗?也许提供一些简短的例子?
到目前为止,我知道以下内容:
1)使用STL算法进行重载是一个常见的例子:
class Example
{
public:
int operator()(int i)
{
return i+10;
}
};
int main()
{
std::vector<int> V{1,2,3,4,5};
std::transform(V.begin(), V.end(), V.begin(), Example());
}
Run Code Online (Sandbox Code Playgroud)
虽然我认为现在这与lambda功能略有不同.
2)操纵对象成员:
class Example
{
public:
int some_variable {0};
Example() {};
Example(int x) : some_variable{x} {};
Example operator+(Example &EO)
{
Example EO3;
EO3.some_variable = some_variable + EO.some_variable;
return EO3;
}
};
int main()
{
Example EO1(100);
Example EO2(200);
Example EO3 {EO1 + EO2};
}
Run Code Online (Sandbox Code Playgroud) 我已经获得了以下类接口:
class Misty m where
banana :: (a -> m b) -> m a -> m b
unicorn :: a -> m a
Run Code Online (Sandbox Code Playgroud)
现在我需要修改它以启用:
jellybean :: (Misty m) => m (m a) -> m a
Run Code Online (Sandbox Code Playgroud)
我相信问题是推动我添加一个Misty带有多个参数的子类:
class Misty m => VeryMisty m a where
... banana' (Just (Just v)) = banana --?
Run Code Online (Sandbox Code Playgroud)
我不确定如何创建一个函数Misty来操作这个嵌套的monad?
我也不确定我的方法是否正确和/或最简单?
我正在尝试将列表"profile1"中的数据转换为名为"DataSubject"的自定义类型.
我将此传递给函数'makeDS'以尝试此转换 - 但是以下操作不起作用:
type Name = String
type Age = Int
type Iq = Int
type Language = String
data DataSubject = DS {name :: Name, age :: Age, iq :: Iq, language :: Language} deriving (Show)
data Contain = Name String | Age Int | Iq Int | Language String deriving (Show) --Use so list can take multiple types
profile1 = [Name "Bob", Age 22, Iq 100, Language "French"]
makeDS :: [Contain] -> DataSubject
makeDS t = DS …Run Code Online (Sandbox Code Playgroud) 我已经按照指南创建了一个使用以下数据类型的二叉搜索树:
data BinarySearchTree a = EmptyTree | TreeNode a (BinarySearchTree a) (BinarySearchTree a) deriving (Show, Read, Eq)
Run Code Online (Sandbox Code Playgroud)
我是否正确地说'TreeNode'正在使用递归,即创建自己数据类型的2个元素'(BinarySearchTree a)(BinarySearchTree a)'?
我从来没有见过像这样的数据类型,任何简短的解释都会很棒!
我试图迭代自定义数据类型列表,并确定特定类型的值.在这种情况下,我想要列表中的年龄:
data MyData = Age Int | DOB Int | Name String | Address String
myList = [Age 89, DOB 13, Age 33, Name "Barbra", Address "103 Lane"]
myFunction :: [MyData] -> MyData
myFunction (x : xs) = if x == Age then x : myFunction xs else myFunction xs
Run Code Online (Sandbox Code Playgroud)
错误:
"Age is applied to too few arguments"
Run Code Online (Sandbox Code Playgroud)
什么是最好的解决方案?
我有以下数据类型:
data Users id height weight = User id height weight
instance Functor Users where
fmap f (User id height weight) = User(f id height weight)
Run Code Online (Sandbox Code Playgroud)
然而这不会编译?
当我使用具有单个参数的类型时,它工作正常,例如:
data Users id = User id
instance Functor Users where
fmap f (User id) = User (f id)
Run Code Online (Sandbox Code Playgroud)
为什么我的第一个例子不起作用?
有点简单的问题,我使用std :: rotate在向量中旋转元素的顺序:
std::vector<int> V {1,2,3,4};
std::rotate(V.rbegin(), V.rbegin() + K, V.rend());
//output: {4,1,2,3}
Run Code Online (Sandbox Code Playgroud)
我得到一个分段错误,其中K> = V.size(),我很难理解:1)为什么会出现这个错误?2)如何用这样的K值进行旋转操作?
例如,K为6应输出{2,3,4,1}